Kod ini berfungsi sama ada anda menggunakan Stop Loss atau tidak.
Keperluan
- Anda perlu memasukkan "Trade.mqh" untuk mengakses kelas CTrade yang membolehkan anda bekerja dengan posisi dan pesanan.
#include <Trade\Trade.mqh> // <<------------------------------------------ Sertakan "Trade.mqh" untuk mengakses Kelas CTrade
- Anda perlu menetapkan parameter input untuk menyesuaikan jarak trailing mengikut keperluan anda. Ini tidak wajib, tetapi lebih mudah.
input double Traling_Step = 3.0;
- Anda perlu mendefinisikan instance untuk kelas CTrade. Namanya boleh apa saja. Lebih baik jika diletakkan selepas pengendali acara OnInit.
CTrade trade; // <<------------------------------------------ Deklarasikan kelas "CTrade". Anda boleh mengganti "trade" dengan nama lain yang anda mahu
- Kemudian, anda perlu membuat pernyataan if untuk memeriksa jika ada posisi yang sedang berjalan pada masa ini. Pernyataan ini memanggil fungsi Check_TrailingStop(); untuk setiap tick. Ini penting kerana EA perlu trailing dengan tajam dan lancar. Pastikan untuk meletakkan pernyataan ini di atas pengendali acara OnTick agar berfungsi dengan baik.
int OnInit() { //--- buat timer EventSetTimer(60); return(INIT_SUCCEEDED); } void OnTick() { if(PositionsTotal() > 0) { Check_TralingStop(); } } - Anda perlu mendeklarasikan fungsi khusus yang dipanggil Check_TrailingStop(); (dalam kes ini) untuk melakukan selebihnya. Anda boleh menggunakan nama apa pun yang anda mahu.
- Fungsi khusus ini akan mengulangi semua posisi yang dibuka dan trailing mengikut jarak yang anda perlukan.
void Check_TralingStop() { int totalPositions = PositionsTotal(); for(int count = 0; count < totalPositions; count++) { ulong TicketNo = PositionGetTicket(count); // Mendapatkan nombor tiket posisi menggunakan 'indeks' posisi. if(PositionSelectByTicket(TicketNo)) { if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()), _Digits); if(stopLoss < openPrice) { if(bidPrice > openPrice && trailingLevel > openPrice) trade.PositionModify(ticket, trailingLevel, takeProfit); } if(bidPrice > openPrice && trailingLevel > stopLoss) { trade.PositionModify(ticket, trailingLevel, takeProfit); } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); double stopLoss = PositionGetDouble(POSITION_SL); double takeProfit = PositionGetDouble(POSITION_TP); double bidPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); double askPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK); ulong ticket = PositionGetTicket(count); double trailingLevel = NormalizeDouble(askPrice + (Traling_Step * Point()), _Digits); if(stopLoss < openPrice) { if(askPrice < openPrice && trailingLevel < openPrice) trade.PositionModify(ticket, trailingLevel, takeProfit); } if(askPrice < openPrice && trailingLevel < stopLoss) { trade.PositionModify(ticket, trailingLevel, takeProfit); } } } } }
Komen 0