前提・実現したいこと
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+SLPoint,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;
}
あなたの回答
tips
プレビュー