Подскажите пожалуйста. Эксперт не открывает ордера в терминале. Компиляция проходит, по графикам ордера должны открываться. По факту их нет. Код прилагаю.
double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//Определение количества лотов double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);//Параметры MACD основной линии текущего бара double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);//Параметры MACD основной линии предыдущего бара double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);//Параметры MACD основной линии со смещением на 2 бара double StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Параметры Трейлинг стоп по параметрам ParabolicSAR текущего бара double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара double PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Параметры ParabolicSAR текущего бара double PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Параметры ParabolicSAR предыдущего бара //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { static datetime New_Time=TimeCurrent();// Время текущего бара bool New_Bar=false; // Флаг нового бара int ticket,total,cnt; //--------------------------------------------------------------------------- { New_Bar=false; // Нового бара нет if(Time[0]==New_Time) // Сравниваем время { New_Bar=true; // Поймался новый бар if(New_Bar==false) // Если бар не новый.. return; // ..то уходим } } total=OrdersTotal();// Опредление количства ордеров if(total<1) { //--- нет открытых ордеров if((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))) //Проверка на наличие денежных средств для открытия минимального лота { Print("Недостаточно средств. Свободные средства = ",AccountFreeMargin()); return; }
//--- условие для открытия длинной позиции (BUY) if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0) && PSARCurrent<iOpen(NULL,0,1)) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,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((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0) && PSARCurrent>iOpen(NULL,0,1)) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red); if(ticket>0)//проверка открытия позиции { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL ордер открыт : ",OrderOpenPrice()); else Print("Ошибка открытия SELL ордера : ",GetLastError()); return; } } //--- выход из блока "нет открытых ордеров"
} //--- важно правильно войти в рынок, но более важно правильно из него выйти for(cnt=0;cnt<total;cnt++) { if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MAGICNUMBER && // проверка магического номера ордера OrderSymbol()==Symbol()) // проверка символа ордера { //--- длинная позиция открыта if(OrderType()==OP_BUY) { //--- должен быть закрыт? if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0) && PSARCurrent>iOpen(NULL,0,1)) { //--- закрытие ордера и выход if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("Ошибка закрытия ордера ",GetLastError()); return; } //------------------Модификация ордера по СтопЛоссу if(StopLoss>Previous_StopLoss && StopLoss<iOpen(NULL,0,0)) if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue)) Print("Ошибка модификации ордера. Код ошибки=",GetLastError()); else Print("Цена Stop Loss ордера успешно модифицирована."); return; } }
else // идём на короткую позицию if(OrderType()==OP_SELL) { //--- должен быть закрыт? if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0) && PSARCurrent<iOpen(NULL,0,1)) { //--- закрытие ордера и выход if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("Ошибка закрытия ордера ",GetLastError()); return; } //-----------------Модификация ордера по СтопЛоссу if(StopLoss<Previous_StopLoss && StopLoss>iOpen(NULL,0,0)) if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue)) Print("Ошибка модификации ордера. Код ошибки=",GetLastError()); else Print("Цена Stop Loss ордера успешно модифицирована."); return; } } }
Дратути. Как делать подобную панель?
Дратути. Как делать подобную панель?
Дратути. Как делать подобную панель?
Vitaly Muzichenko, Artyom Trishkin спасиб.
Продолжаю писать очередной свиной рыгаль на мартингейле, сливающий даже в тестере, иначе как же нам лося вырастить.
В текущий момент есть желаемый параметр который должен отвечать за возможность открытия следующего ордера после того как закроется предыдущий(е)
нужно сделать 2 сценария
1) если значение истинно
открываем ордер
обрабатываем
закрываем
и по новой
2) если ложно
Открываем ордер
Обрабатываем
Закрываем
и весело выполняем ExpertRemove
вся проблема в том что эти два условия взаимоисключающие, но нужно совместить в 1 эксперте так как
1) на старте задается значение
2) в условиях входа и обработки оно принимается к обработке как (если истина то открываем)
3) после закрытия ставим ложное
Если кому такое интересно буду рад выслушать варианты.Всё просто же:
С логикой беда.
Всё просто же:
Вроде что-то не то, если истинно - нужно капусту рубить, а не в кусты)
Подскажите пожалуйста. Эксперт не открывает ордера в терминале. Компиляция проходит, по графикам ордера должны открываться. По факту их нет. Код прилагаю.
double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//Определение количества лотов
double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);//Параметры MACD основной линии текущего бара
double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);//Параметры MACD основной линии предыдущего бара
double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);//Параметры MACD основной линии со смещением на 2 бара
double StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Параметры Трейлинг стоп по параметрам ParabolicSAR текущего бара
double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Параметры СтопЛосс по параметрам ParabolicSAR предыдущего бара
double PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Параметры ParabolicSAR текущего бара
double PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Параметры ParabolicSAR предыдущего бара
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
static datetime New_Time=TimeCurrent();// Время текущего бара
bool New_Bar=false; // Флаг нового бара
int ticket,total,cnt;
//---------------------------------------------------------------------------
{
New_Bar=false; // Нового бара нет
if(Time[0]==New_Time) // Сравниваем время
{
New_Bar=true; // Поймался новый бар
if(New_Bar==false) // Если бар не новый..
return; // ..то уходим
}
}
total=OrdersTotal();// Опредление количства ордеров
if(total<1)
{
//--- нет открытых ордеров
if((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT)))
//Проверка на наличие денежных средств для открытия минимального лота
{
Print("Недостаточно средств. Свободные средства = ",AccountFreeMargin());
return;
}
//--- условие для открытия длинной позиции (BUY)
if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,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((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red);
if(ticket>0)//проверка открытия позиции
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL ордер открыт : ",OrderOpenPrice());
else
Print("Ошибка открытия SELL ордера : ",GetLastError());
return;
}
}
//--- выход из блока "нет открытых ордеров"
}
//--- важно правильно войти в рынок, но более важно правильно из него выйти
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MAGICNUMBER && // проверка магического номера ордера
OrderSymbol()==Symbol()) // проверка символа ордера
{
//--- длинная позиция открыта
if(OrderType()==OP_BUY)
{
//--- должен быть закрыт?
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
//--- закрытие ордера и выход
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("Ошибка закрытия ордера ",GetLastError());
return;
}
//------------------Модификация ордера по СтопЛоссу
if(StopLoss>Previous_StopLoss && StopLoss<iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss ордера успешно модифицирована.");
return;
}
}
else // идём на короткую позицию
if(OrderType()==OP_SELL)
{
//--- должен быть закрыт?
if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
//--- закрытие ордера и выход
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("Ошибка закрытия ордера ",GetLastError());
return;
}
//-----------------Модификация ордера по СтопЛоссу
if(StopLoss<Previous_StopLoss && StopLoss>iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss ордера успешно модифицирована.");
return;
}
}
}
//-------------------------------------------------------------------------------------------------------
да, впринципе все проще
а что если оставить этот вариант как запасной и сделать вот так
проверяем условие и...т.е как тогда заблокировать вход для дальнейшей работы