Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
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; } } } } //------ } //-------------------------------------------------------------------------------------------------------
我想自己学习如何写代码...所以我想我要征求一些建议。我想也许有人可以给我一个样本......谢谢你
客户抱怨说,即使专家顾问已经从图表中删除,也一直在开交易。这不可能是事实,对吗?
如果删除并正确书写,应该不会。用去初始化代码卸载 - 1.如果专家顾问锁定了...我们必须处理好这个问题...
如果您关闭EA窗口,EA将被卸下去初始化代码 - 4。
原因_chartclose
4
图表已关闭
https://www.mql5.com/ru/docs/constants/namedconstants/uninit
嗯,这是正确的,在我的记忆中,那里有metaquote的报价,而且Tickstory的质量很好。
至少要有一张截图,以了解你要合并的行数
至少要有一张截图,以了解你想合并哪些行。
至少要有一张截图,以了解你想组合什么样的线条。谢谢你的答复我想在MT4上将两个上层工具行连接成一个。
变量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;
}
}
}
}
//------
}
//-------------------------------------------------------------------------------------------------------
伙计们,一个提示。测试器给出错误:2017.02.08 18:24:43.751 TestGenerator:不匹配的数据错误(2016.07.27 19:30的低值1.09860没有从最低时间段达到,低价1.09880不匹配。)