Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
皆さん、ヒントです。Tester gives error:2017.02.08 18:24:43.751 TestGenerator: unmatched data error (low value 1.09860 at 2016.07.27 19:30 is not reached from lowest timeframe, low price 1.09880 mismatches.).
これはどういうことなのか、どうすれば直るのか。私は何か悪いことをしたのだろうか?
double Margin_Percent=AccountFreeMargin()*Percent/100; //Используемые средства для открытия ордеров double Lots=Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED);//Определение общего количества лотов double Lots_Volume=(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP)); double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_CLOSE,MODE_MAIN,1); //Параметры MACD основной линии текущего бара double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_CLOSE,MODE_MAIN,2);//Параметры MACD основной линии предыдущего бара double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_CLOSE,MODE_MAIN,3);//Параметры MACD основной линии со смещением на 2 бара double StopLoss=iSAR(NULL,0,Step_PSAR,Maximum_PSAR,0);//Параметры Трейлинг стоп по параметрам ParabolicSAR текущего бара double Previous_StopLoss=iSAR(NULL,0,Step_PSAR,Maximum_PSAR,1);//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара double CurrentPSAR=iSAR(NULL,0,Step_PSAR,Maximum_PSAR,1);//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ voidOnTick() { staticdatetime New_Time=TimeCurrent();// Время текущего бара bool New_Bar=false; // Флаг нового бара int ticket,total,cnt; //--------------------------------------------------------------------------- total=OrdersTotal();// Опредление количства ордеров if(total<1) { //--- нет открытых ордеров if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))) //Проверка на наличие денежных средств для открытия минимального лота { Print("Не хватает средств. Свободные средства = ",AccountFreeMargin()); return; } if(Time[0]==New_Time) // Сравниваем время { New_Bar=true; // Поймался новый бар if(New_Bar==false) // Если бар не новый.. return; // ..то уходим } //Определение количества лотов if(Lots>Lots_Volume) Lots=Lots_Volume; elseif(Lots<Lots_Volume) Lots=MathFloor(Lots); return; //--- условие для открытия длинной позиции (BUY) if(CurrentPSAR<iOpen(NULL,0,1) && ((MacdPrevious1>0 && MacdPrevious2<0) || (MacdCurrent>0 && MacdPrevious1<0) || (MacdCurrent>0 && MacdPrevious1==0 && MacdPrevious2<0)|| (MacdCurrent>0 && MacdPrevious1==0 && MacdPrevious2==0))) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,NULL,MAGICNUMBER,0,Green); if(ticket>0)//проверка отрытия позиции { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY ордер открыт : ",OrderOpenPrice()); elsePrint("Ошибка открытия ордера BUY : ",GetLastError()); return; } } //--- условие для открытия короткой позиции (SELL) if(CurrentPSAR>iOpen(NULL,0,1) && ((MacdCurrent<0 && MacdPrevious1>0) || (MacdPrevious1<0 && MacdPrevious2>0) || (MacdCurrent<0 && MacdPrevious1<0 && MacdPrevious2>0) || (MacdCurrent<0 && MacdPrevious1==0 && MacdPrevious2==0))) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,NULL,MAGICNUMBER,0,Red); if(ticket>0)//проверка открытия позиции { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL ордер открыт : ",OrderOpenPrice()); elsePrint("Ошибка открытия ордера SELL : ",GetLastError()); return; } } return; //--- выход из блока "нет открытых ордеров" } //--- важно правильно войти в рынок, но более важно правильно из него выйти for(cnt=0;cnt<total;cnt++) { if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderMagicNumber()==MAGICNUMBER && // проверка магического номера ордера OrderSymbol()==Symbol()) // проверка символа ордера { //--- длинная позиция открыта if(OrderType()==OP_BUY) { //--- должен быть закрыт? if(CurrentPSAR>iOpen(NULL,0,1) && ((MacdCurrent<0 && MacdPrevious1>0) || (MacdPrevious1<0 && MacdPrevious2>0) || (MacdCurrent<0 && MacdPrevious1<0 && MacdPrevious2>0) || (MacdCurrent<0 && MacdPrevious1==0 && MacdPrevious2==0))) { //--- закрытие ордера и выход if(OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) { Print("Ордер закрыт"); ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,NULL,MAGICNUMBER,0,Red); if(ticket>0)//проверка открытия позиции { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL ордер открыт : ",OrderOpenPrice()); elsePrint("Ошибка открытия ордера SELL : ",GetLastError()); return; } } elsePrint("Ошибка закрытия ордера ",GetLastError());
} //------------------Модификация ордера по СтопЛоссу elseif(StopLoss>Previous_StopLoss && StopLoss<iOpen(NULL,0,0)) { if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,0,Blue)) Print("Цена Stop Loss ордера успешно модифицирована."); elsePrint("Ошибка модификации ордера. Код ошибки=",GetLastError()); return; } return; } // идём на короткую позицию elseif(OrderType()==OP_SELL) { //--- должен быть закрыт? if(CurrentPSAR<iOpen(NULL,0,1) && ((MacdPrevious1>0 && MacdPrevious2<0) || (MacdCurrent>0 && MacdPrevious1<0) || (MacdCurrent>0 && MacdPrevious1==0 && MacdPrevious2<0)|| (MacdCurrent>0 && MacdPrevious1==0 && MacdPrevious2==0))) { //--- закрытие ордера и выход if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) { Print("Ордер закрыт"); ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,NULL,MAGICNUMBER,0,Green); if(ticket>0)//проверка отрытия позиции { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY ордер открыт : ",OrderOpenPrice()); elsePrint("Ошибка открытия ордера BUY : ",GetLastError()); return; } } elsePrint("Ошибка закрытия ордера ",GetLastError()); } //-----------------Модификация ордера по СтопЛоссу elseif(StopLoss<Previous_StopLoss && StopLoss>iOpen(NULL,0,0)) { if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,0,Blue)) Print("Цена Stop Loss ордера успешно модифицирована."); elsePrint("Ошибка модификации ордера. Код ошибки=",GetLastError()); return; } } } } //------ } //-------------------------------------------------------------------------------------------------------
Michail_David: 皆さん、ヒントです。Tester gives error:2017.02.08 18:24:43.751 TestGenerator: unmatched data error (low value 1.09860 at 2016.07.27 19:30 is not reached from lowest timeframe, low price 1.09880 mismatches.).
自分でコードを書けるようになりたい...。そこで、アドバイスをいただこうと思ったのです。誰かサンプルをくれるんじゃないかと思って・・・ありがとうございました。
クライアントから、Expert Advisor がチャートから削除されても、取引を開始し続けるという苦情がありました。これはありえないですよね?
削除して正しく書けば、そうならないはずです。非初期化コードによるアンロード - 1.Expert Advisorがループする場合...どうにかしないと...。
EAウィンドウを閉じると、非初期化コード-4でEAがアンロードされます。
reason_chartclose
4
チャートは終了しました
https://www.mql5.com/ru/docs/constants/namedconstants/uninit
まあ、それはそれとして、そこには私の記憶ではmetaquoteの引用があり、Tickstoryは良質である。
少なくとも、マージしたい行を理解するためのスクリーンショットが必要です。
少なくとも、マージしたい行を理解するためのスクリーンショットが必要です。
せめてスクリーンショットで、どのような線を組み合わせたいのかがわかるようにしてください。ご返信ありがとうございましたMT4で2つの上部ツール列を1つに結合したいのですが。
変数dTの赤色は何を意味するのでしょうか?
変数dTの赤色は何を意味するのでしょうか?
double Lots=Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED);//Определение общего количества лотов
double Lots_Volume=(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP));
double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_CLOSE,MODE_MAIN,1); //Параметры MACD основной линии текущего бара
double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_CLOSE,MODE_MAIN,2);//Параметры MACD основной линии предыдущего бара
double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_CLOSE,MODE_MAIN,3);//Параметры MACD основной линии со смещением на 2 бара
double StopLoss=iSAR(NULL,0,Step_PSAR,Maximum_PSAR,0);//Параметры Трейлинг стоп по параметрам ParabolicSAR текущего бара
double Previous_StopLoss=iSAR(NULL,0,Step_PSAR,Maximum_PSAR,1);//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара
double CurrentPSAR=iSAR(NULL,0,Step_PSAR,Maximum_PSAR,1);//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
static datetime New_Time=TimeCurrent();// Время текущего бара
bool New_Bar=false; // Флаг нового бара
int ticket,total,cnt;
//---------------------------------------------------------------------------
total=OrdersTotal();// Опредление количства ордеров
if(total<1)
{
//--- нет открытых ордеров
if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT)))
//Проверка на наличие денежных средств для открытия минимального лота
{
Print("Не хватает средств. Свободные средства = ",AccountFreeMargin());
return;
}
if(Time[0]==New_Time) // Сравниваем время
{
New_Bar=true; // Поймался новый бар
if(New_Bar==false) // Если бар не новый..
return; // ..то уходим
}
//Определение количества лотов
if(Lots>Lots_Volume)
Lots=Lots_Volume;
else if(Lots<Lots_Volume)
Lots=MathFloor(Lots);
return;
//--- условие для открытия длинной позиции (BUY)
if(CurrentPSAR<iOpen(NULL,0,1) &&
((MacdPrevious1>0 && MacdPrevious2<0) ||
(MacdCurrent>0 && MacdPrevious1<0) ||
(MacdCurrent>0 && MacdPrevious1==0 && MacdPrevious2<0)||
(MacdCurrent>0 && MacdPrevious1==0 && MacdPrevious2==0)))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//проверка отрытия позиции
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY ордер открыт : ",OrderOpenPrice());
else Print("Ошибка открытия ордера BUY : ",GetLastError());
return;
}
}
//--- условие для открытия короткой позиции (SELL)
if(CurrentPSAR>iOpen(NULL,0,1) &&
((MacdCurrent<0 && MacdPrevious1>0) ||
(MacdPrevious1<0 && MacdPrevious2>0) ||
(MacdCurrent<0 && MacdPrevious1<0 && MacdPrevious2>0) ||
(MacdCurrent<0 && MacdPrevious1==0 && MacdPrevious2==0)))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,NULL,MAGICNUMBER,0,Red);
if(ticket>0)//проверка открытия позиции
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL ордер открыт : ",OrderOpenPrice());
else Print("Ошибка открытия ордера SELL : ",GetLastError());
return;
}
}
return; //--- выход из блока "нет открытых ордеров"
}
//--- важно правильно войти в рынок, но более важно правильно из него выйти
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderMagicNumber()==MAGICNUMBER && // проверка магического номера ордера
OrderSymbol()==Symbol()) // проверка символа ордера
{
//--- длинная позиция открыта
if(OrderType()==OP_BUY)
{
//--- должен быть закрыт?
if(CurrentPSAR>iOpen(NULL,0,1) &&
((MacdCurrent<0 && MacdPrevious1>0) ||
(MacdPrevious1<0 && MacdPrevious2>0) ||
(MacdCurrent<0 && MacdPrevious1<0 && MacdPrevious2>0) ||
(MacdCurrent<0 && MacdPrevious1==0 && MacdPrevious2==0)))
{
//--- закрытие ордера и выход
if(OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
{
Print("Ордер закрыт");
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,NULL,MAGICNUMBER,0,Red);
if(ticket>0)//проверка открытия позиции
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL ордер открыт : ",OrderOpenPrice());
else Print("Ошибка открытия ордера SELL : ",GetLastError());
return;
}
}
else Print("Ошибка закрытия ордера ",GetLastError());
}
//------------------Модификация ордера по СтопЛоссу
else if(StopLoss>Previous_StopLoss && StopLoss<iOpen(NULL,0,0))
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,0,Blue))
Print("Цена Stop Loss ордера успешно модифицирована.");
else Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
return;
}
return;
}
// идём на короткую позицию
else if(OrderType()==OP_SELL)
{
//--- должен быть закрыт?
if(CurrentPSAR<iOpen(NULL,0,1) &&
((MacdPrevious1>0 && MacdPrevious2<0) ||
(MacdCurrent>0 && MacdPrevious1<0) ||
(MacdCurrent>0 && MacdPrevious1==0 && MacdPrevious2<0)||
(MacdCurrent>0 && MacdPrevious1==0 && MacdPrevious2==0)))
{
//--- закрытие ордера и выход
if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
{
Print("Ордер закрыт");
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//проверка отрытия позиции
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY ордер открыт : ",OrderOpenPrice());
else Print("Ошибка открытия ордера BUY : ",GetLastError());
return;
}
}
else Print("Ошибка закрытия ордера ",GetLastError());
}
//-----------------Модификация ордера по СтопЛоссу
else if(StopLoss<Previous_StopLoss && StopLoss>iOpen(NULL,0,0))
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,0,0,Blue))
Print("Цена Stop Loss ордера успешно модифицирована.");
else Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
return;
}
}
}
}
//------
}
//-------------------------------------------------------------------------------------------------------
皆さん、ヒントです。Tester gives error:2017.02.08 18:24:43.751 TestGenerator: unmatched data error (low value 1.09860 at 2016.07.27 19:30 is not reached from lowest timeframe, low price 1.09880 mismatches.).