質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

Q&A

0回答

2079閲覧

トレーリング機能の実装について

kazux

総合スコア4

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

0グッド

0クリップ

投稿2019/08/30 16:09

前提・実現したいこと

最初に一度だけ設定した買い逆指値、売り逆指値に即時発動型のトレーリングストップ機能
を実装させる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のなかをどのように変更すればよいでしょうか???

引用している部分が多く分かっておりませんので、
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問