前提・実現したいこと
最初に一度だけ設定した買い逆指値、売り逆指値に即時発動型のトレーリングストップ機能
を実装させるEAを作成していたのですが、トレーリングストップ機能が実行されません。
コード自体にエラーが出ている訳ではないのですが、
どのようにすればトレーリングストップ機能が実行されるでしょうか???
トレーリングストップに関しては、
約定後すぐに開始するものを希望しています。
また、変動する価格に対してストップが常時変化していくものがよいです。
発生している問題・エラーメッセージ
買い、売りともに逆指値のオーダーは通るのですが、 その後設定したトレーリングストップ機能が実行されません。 メッセージにもエラーは見当たりません。
該当のソースコード
//+---------------------------------------------------------------------+ // パラメーター設定 //+---------------------------------------------------------------------+ extern int Magic =1111; extern int Trailing_Stop = 50; double Pips = 0; extern int Width = 20; extern int TakeProfit = 50; extern int StopLoss = 20; extern double Lots =0.1; extern int slippage =20; extern int MaxSpread =30; extern int ExpirationMinute = 0; //+---------------------------------------------------------------------+ // 一般関数 //+---------------------------------------------------------------------+ double AdjustPoint(string Currency) { int Symbol_Digits = (int)MarketInfo(Currency,MODE_DIGITS); if(Symbol_Digits == 2 || Symbol_Digits == 3) { double Calculated_Point = 0.01; } else if(Symbol_Digits == 4 || Symbol_Digits == 5) { Calculated_Point = 0.0001; } return(Calculated_Point); } //+---------------------------------------------------------------------+ // エグジット関連関数 //+---------------------------------------------------------------------+ //トレーリングストップ_即時発動型 void TrailingStop() { double new_sl; int res; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY && OrderStopLoss()<Bid ) { new_sl = Bid-(Trailing_Stop*AdjustPoint(Symbol())); if( new_sl > OrderStopLoss()) { res=OrderModify(OrderTicket(),OrderOpenPrice(),new_sl,OrderTakeProfit(),0,Green); } } else if(OrderType()==OP_SELL && (OrderStopLoss()>Ask || OrderStopLoss()==0) ) { new_sl = Ask+(Trailing_Stop*AdjustPoint(Symbol())); if( new_sl < OrderStopLoss() || OrderStopLoss()==0 ) { res=OrderModify(OrderTicket(),OrderOpenPrice(),new_sl,OrderTakeProfit(),0,Red); } } } } } //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int init() { //---- if(!IsTradeAllowed()){ Alert("Error: Trade not allowed. Check [Allow live trading]"); return(0); } int stoplevel =MarketInfo(Symbol(),MODE_STOPLEVEL); if(Width < stoplevel){ Alert("Error: Width ( "+Width+" ) < stoplevel ( "+stoplevel+" )"); return(0); } if(TakeProfit < stoplevel){ Alert("Error: TakeProfit ( "+TakeProfit+" ) < stoplevel ( "+stoplevel+" )"); return(0); } if(StopLoss < stoplevel){ Alert("Error: StopLoss ( "+StopLoss+" ) < stoplevel ( "+stoplevel+" )"); return(0); } ///////////////////////////////////////////////////////////////// datetime expiration = 0; if(ExpirationMinute !=0 && ExpirationMinute <11){ Alert("Error: ExpirationMinute must be greater than 10"); return(0); } if(ExpirationMinute !=0 ){ expiration = TimeCurrent() + ExpirationMinute*60; } ///////////////////////////////////////////////////////////////// double tp=0,sl=0; double target = Ask + Width*Point; if(TakeProfit != 0) tp = target + TakeProfit*Point; if(StopLoss != 0) sl = target - StopLoss*Point; if( MarketInfo(Symbol(),MODE_SPREAD) < MaxSpread) { int ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,target,3,sl,tp,"2Orders #1",slippage,expiration,Green); if(ticket< 0 ) { Print("OrderSend failed with error #",GetLastError()); return(0); } } tp=0;sl=0; target = Bid - Width*Point; if(TakeProfit != 0) tp = target - TakeProfit*Point; if(StopLoss != 0) sl = target + StopLoss*Point; if( MarketInfo(Symbol(),MODE_SPREAD) < MaxSpread) { int ticket2=OrderSend(Symbol(),OP_SELLSTOP,Lots,target,3,sl,tp,"2Orders #2",slippage,expiration,Red); if(ticket2<0) { Print("OrderSend failed with error #",GetLastError()); OrderDelete(ticket); return(0); } } Pips = AdjustPoint(Symbol()); return(0); //---- return(0); } //+---------------------------------------------------------------------+ // ティック毎の処理 //+---------------------------------------------------------------------+ int start() { //即時発動型トレーリングストップ static bool checkDone; int sec = TimeSeconds(TimeGMT()); if(sec == 0 || sec == 10 || sec == 20|| sec == 30|| sec == 40|| sec == 50 ) { if(checkDone==false) { TrailingStop(); checkDone = true; } } else { checkDone = false; } // ニューバーの発生直後以外は取引しない static datetime bartime=Time[0]; if (Time[0]==bartime) return; bartime=Time[0]; checkDone = false; }
補足情報(FW/ツールのバージョンなど)
また、変動する価格に対してストップが常時変化していくには、
startのなかをどのように変更すればよいでしょうか???
引用している部分が多く分かっておりませんので、
よろしくお願いいたします。
あなたの回答
tips
プレビュー