MT4でトレーディングストップでCLOSEするソースを公開しました。
どうしてトレーディングストップでCloseする必要があるのか?
利益を最大に伸ばし、STOPロスを最小限にする方法として有効です。サンプルソースでは、現在の収益をPips値で算出し、取引をSTOPするのか、STOPするPipを変更するのかを判断します。
ソースの説明
初期はOPEN値よりも3pipマイナスになったら取引をSTOP、利益が3pipプラスになったらSTOP値を0pip、6pipプラスになったらSTOP値を3pipというように、3pipづつ刻んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#include <stdlib.mqh> int MagicNo=1000; int TicketNo=0; double shoki_winpip=3; //初期にSTOPLOSSを切り上げるPip値の閾値 double shoki_losepip=-3; //初期のSTOPLOSSのpip値 double winpip=3; double losepip=-3; double kiriagepip=3; //STOPLOSSを何Pip切り上げるかの値 int OnInit(){ for(int i=0; i<OrdersTotal(); i++){ //ポジション保持中にEAを再起動したときにTicketNoを取り直す if(OrderSelect(i, SELECT_BY_POS) == false) continue; if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNo) continue; TicketNo = OrderTicket(); Print("Get ticketNo=",TicketNo); } return(INIT_SUCCEEDED); } void OnDeinit(const int reason){ ObjectsDeleteAll(); } void OnTick() { int close=0; int err=0; if(Ordercheck()==false){ //同じMagicNoのポジションがなければOpen TicketNo = OrderSend(Symbol(),OP_BUY,0.01,Ask,0,0,0,WindowExpertName(),MagicNo,0,clrRed); err = GetLastError(); Print("[OrderOpenError] : ", err, " ", ErrorDescription(err)); } if(Ordercheck()==true){ //同じMagicNoのポジションがあればトレーディングSTOPの判定 double profitpips=0; profitpips = MyOrderProfitPips(MagicNo); if(profitpips>=winpip) { //利益が閾値を超えたらLosePipを切り上げ losepip=losepip+kiriagepip; winpip=winpip+kiriagepip; Print("Losepip up=",losepip); } if(profitpips<=losepip) { //損失が閾値を下回ったらClose Print("STOP LOSS"); close = OrderClose(TicketNo,0.01,Bid,0,Green); err = GetLastError(); Print("[OrderSendError] : ", err, " ", ErrorDescription(err)); winpip=shoki_winpip; losepip=shoki_losepip; } } } //MagicNoが同一のOpenポジションが存在するかの確認 bool Ordercheck() { if(OrdersTotal()>0) { for(int i=0; i<OrdersTotal(); i++){ if(OrderSelect(i, SELECT_BY_POS) == false) continue; if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNo) continue; return(true); } } return(false); } //Profit(pip値)の確認 double MyOrderProfitPips(int pos_id=0) { double newprofit = 0; double profit = 0; int mult=1; if(Digits == 3 || Digits == 5) mult=10; //通貨ペアの桁数を調整 for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS) == false) break; if(OrderSymbol() != Symbol() || OrderMagicNumber() != pos_id) continue; newprofit = OrderClosePrice() - OrderOpenPrice(); //現在のレートとOpenレートの差を計算 if(newprofit != 0) break; } if(OrderType() == OP_BUY) profit = newprofit; if(OrderType() == OP_SELL) profit = -newprofit; return profit/Point/mult; //pipに変換 } |
補足説明
・通貨ペアの桁数によってPipの桁数が変わりますが、Digit変数で桁数を把握することでPipの桁数を自動調整することができます。
AIを活用した自動売買EAの無料配布始めました。3年以上の年月をかけて大分安定してきましてので、よければ「機械学習EA(Aizack)とは」をご覧ください。