Stafort: Хочется самому научиться писать код.. Вот и решил спросить совета. Думал может кто даст образец.. Спасибо!
Вот здесь вам очень много образцов, подберите самый подходящий, и его уже правьте под свои нужды. Если не получается, всегда можно задать вопросы на этом форуме, и получить на них ответы.
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
MONTE_CRISTO: ну правильно там же метаквотовские котировки на сколько я помню дырявые котировки а тикстори хорошее качество
Открываете счёт в ДЦ с МТ5, будут реальные "не рваные" котировки, о чём вопрос? В тикстори тоже иногда фигня получается, или я её готовить так и не научился, а с МТ5 экспорт проще и быстрее.
Sergey Gritsay: Хотя бы скриншотик, что бы понять, что за строки вы хотите о
Sergey Gritsay: Хотя бы скриншотик, что бы понять, что за строки вы хотите объединять.
Sergey Gritsay: Хотя бы скриншотик, что бы понять, что за строки вы хотите объединять. Благодарю за ответ! Хочу обьеденить две верхние строки инструментов в одну на МТ4.
Люди! Подскажите. Тестер выдаёт ошибку: 2017.02.08 18:24:43.751TestGenerator: unmatched data error (low value 1.09860 at 2016.07.27 19:30 is not reached from the least 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: Люди! Подскажите. Тестер выдаёт ошибку: 2017.02.08 18:24:43.751TestGenerator: unmatched data error (low value 1.09860 at 2016.07.27 19:30 is not reached from the least timeframe, low price 1.09880 mismatches)
Что это значит и как её исправить? Что я не так сделал?
Хочется самому научиться писать код.. Вот и решил спросить совета. Думал может кто даст образец.. Спасибо!
Клиент жалуется, что советник продолжает открывать сделки даже если был удален с графика. Такого же не может быть?
Если удален и корректно написан - не должно быть. Выгрузка с кодом деинициализации - 1. Если советник зацикливается... тут нужно разбираться...
Если закрыть окно с экспертом - эксперт должен выгружаться с кодом деинициализации - 4:
REASON_CHARTCLOSE
4
График закрыт
https://www.mql5.com/ru/docs/constants/namedconstants/uninit
ну правильно там же метаквотовские котировки на сколько я помню дырявые котировки а тикстори хорошее качество
Хотя бы скриншотик, что бы понять, что за строки вы хотите о
Хотя бы скриншотик, что бы понять, что за строки вы хотите объединять.
Хотя бы скриншотик, что бы понять, что за строки вы хотите объединять. Благодарю за ответ! Хочу обьеденить две верхние строки инструментов в одну на МТ4.
Что может означать красный цвет переменной 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: unmatched data error (low value 1.09860 at 2016.07.27 19:30 is not reached from the least timeframe, low price 1.09880 mismatches)