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

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

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

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

Q&A

0回答

723閲覧

トレーディングストップを実装したEA

Akira_Nishimura

総合スコア10

MQL4

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

0グッド

0クリップ

投稿2019/06/02 17:42

前提・実現したいこと

MQL4でポジション保有時間でトレーディングストップを付けたいと思っています。

一度目のオーダー変更でオープンプライスにストップを変更、
二度目以降のオーダー変更で直近12本分(一時間分)の平均値にストップ変更。
以下三度目、4度目も同じです。

発生している問題・エラーメッセージ

バックテストを取ると、一度目のオープンプライスに変更はできるのですが、
二度目の変更が実行されません。(二度目の変更が通らないのでコードは二度目までしか書いていません。)

該当のソースコード

int FirstTime = 12; //一時間=12(5分足)

//+------------------------------------------------------------------+
//|メイン |
//+------------------------------------------------------------------+
void OnTick()
{
int cnt,total;
if(Bars<100)
{
Print("bars less than 100");
return;
}

//1本前のRSI

double RSI1 = iRSI(_Symbol , 0, RSIperiod, PRICE_CLOSE, 1);

//1本前のCCI

double CCI1 = iCCI(_Symbol , 0, CCIperiod, PRICE_CLOSE, 1);

//1本前のWPR

double WPR1 = iWPR(_Symbol , 0, WPRperiod, 1);

//*▼1本前のBB▼*

double BBmain1 = iBands(_Symbol, 0, BBperiod, BBDeviation, 0, PRICE_CLOSE, MODE_MAIN, 1);
double BBUpper1 = iBands(_Symbol, 0, BBperiod, BBDeviation, 0, PRICE_CLOSE, MODE_UPPER, 1);
double BBLower1 = iBands(_Symbol, 0, BBperiod, BBDeviation, 0, PRICE_CLOSE, MODE_LOWER, 1);
//▲1本前のBB▲

//*▼2本前のBB▼*

double BBmain2 = iBands(_Symbol, 0, BBperiod, BBDeviation, 0, PRICE_CLOSE, MODE_MAIN, 2);
double BBUpper2 = iBands(_Symbol, 0, BBperiod, BBDeviation, 0, PRICE_CLOSE, MODE_UPPER, 2);
double BBLower2 = iBands(_Symbol, 0, BBperiod, BBDeviation, 0, PRICE_CLOSE, MODE_LOWER, 2);
//▲2本前のBB▲

total=OrdersTotal(); if(total<1) { if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ",AccountFreeMargin()); return; } /*買いエントリー*/ if(Close[2] >= BBLower2 && Close[1] < BBLower1 && RSI1 < RSIlower && WPR1 < WPRlower && CCI1 < CCIlower) { EntryL(); } /*売りエントリー*/ if(Close[2] <= BBUpper2 && Close[1] > BBUpper1 && RSI1 > RSIupper && WPR1 > WPRupper && CCI1 > CCIupper) { EntryS(); } } for(cnt=0;cnt<total;cnt++) { if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol { if(OrderType()==OP_BUY) { /*買い1回目ストップロス変更*/ if(TimeCurrent()-OrderOpenTime()>=(Period()*FirstTime)*60) { SettlementL(); return; } /*2回目ストップロス変更*/ if(TimeCurrent()-OrderOpenTime()>=(Period()*FirstTime*2)*60) { SettlementL1(); return; } } else // go to short position { /*売り1回目ストップロス変更*/ if(TimeCurrent()-OrderOpenTime()>=(Period()*FirstTime)*60) { SettlementS(); return; } /*売り2回目ストップロス変更*/ if(TimeCurrent()-OrderOpenTime()>=(Period()*FirstTime*2)*60) { SettlementS1(); return; } } } }

}
void EntryL()
{
int ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SLPoint,0,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else
{
Print("Error opening BUY order : ",GetLastError());
}
return;
}
void EntryS()
{
int ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+SL
Point,0,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else
{
Print("Error opening SELL order : ",GetLastError());
}
return;
}

void SettlementL()
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),0,0,clrAntiqueWhite));
{
Print("Order error ",GetLastError());
}
return;
}

void SettlementS()
{
if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),0,0,clrAntiqueWhite));
{
Print("Order error ",GetLastError());
}
return;
}

void SettlementL1()
{
double Stoplatting = (Close[0] + Close[1] + Close[2] + Close[3] + Close[4] + Close[5] + Close[6] + Close[7] + Close[8] + Close[9] + Close[10] + Close[11])/12;

if(!OrderModify(OrderTicket(),OrderOpenPrice(),Stoplatting,0,0,clrAntiqueWhite)); { Print("Modify error ",GetLastError()); } return;

}

void SettlementS1()
{
double Stoplatting = (Close[0] + Close[1] + Close[2] + Close[3] + Close[4] + Close[5] + Close[6] + Close[7] + Close[8] + Close[9] + Close[10] + Close[11])/12;

if(!OrderModify(OrderTicket(),OrderOpenPrice(),Stoplatting,0,0,clrAntiqueWhite)); { Print("Modify ",GetLastError()); } return;

}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問