mamba5:
Господа, обьясните пожалуйста четко и ясно в чем принципиальная неверность данного кода
где OrderSelect ???
я изменил функцию... но видимо все еще что то не так:
void CloseOrder(int ticket)
{
double PR=0;
while(!IsTradeAllowed()) Sleep(100);
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
{
if(OrderType()==OP_BUY) PR=Bid;
if(OrderType()==OP_SELL) PR=Ask;
if(!OrderClose(ticket,OrderLots(),PR,3,CLR_NONE))
Print("Ошибка закрытия ордера: ",GetLastError());
}
else
Print("OrderSelect() вернул ошибку - ",GetLastError());
return;
}
где ticket это:
int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",0,0,CLR_NONE);
но ошибка все та же... не могли бы вы более развернуто обьяснить в чем я не прав?
int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",0,0,CLR_NONE);
но ошибка все та же... не могли бы вы более развернуто обьяснить в чем я не прав?
int tic у вас оказалась локальной и теряет значение тикета на следующем тике
int tic у вас оказалась локальной и теряет значение тикета на следующем тике
Все. Исправил. Спасибо большое. Затруднение в том что OrderSend:
int NewOrder(int Cmd,double Lot)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(Cmd==OP_BUY)
{
PR=Ask;
if(TakeProfit>0)TP=Ask+TakeProfit*Point;
if(StopLoss>0)SL=Bid-StopLoss*Point;
}
if(Cmd==OP_SELL)
{
PR=Bid;
if(TakeProfit>0)TP=Bid-TakeProfit*Point;
if(StopLoss>0)SL=Ask+StopLoss*Point;
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,5,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError());
return(tic);
}
возвращает ошибки 4107 и 4108. Исправил с применением NormalizeDouble:
int NewOrder(int Cmd,double Lot,int slip)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(Cmd==OP_BUY)
{
PR=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK), Digits);
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK)+TakeProfit*Point;
if(StopLoss>0)SL=NormalizeDouble(MarketInfo(Symbol(),MODE_BID)-StopLoss*Point;
}
if(Cmd==OP_SELL)
{
PR=NormalizeDouble(MarketInfo(Symbol(),MODE_BID), Digits);
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_BID)-TakeProfit*Point;
if(StopLoss>0)SL=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK)+StopLoss*Point;
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,slip,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError());
return(tic);
}
Но теперь при коипиляции выдается: "'\end_of_program' - unbalanced left parenthesis (197, 1)" и непонятно действует ли вообще мое нововведение
Где ваша логика рассуждений:
1."...Исправил с применением NormalizeDouble..."
2."..."
3."..Но теперь при коипиляции выдается: "'\end_of_program' - unbalanced left parenthesis (197, 1)" ...
И, действительно,...
Тогда поясните как решить проблему с возникающими ошибками 4107 и 4108
Тогда поясните как решить проблему с возникающими ошибками 4107 и 4108
Напишите эксперт заново с чистого листа. Компилируя каждое нововведение новой строки или команды.
Напишите эксперт заново с чистого листа. Компилируя каждое нововведение новой строки или команды.
Тем самым я избавлюсь от синтаксических ошибок- ошибок в коде, а логические ошибки- возникающие в ходе работы программы, типа 4107? Или в принципе способ с NormalizeDouble верен?
Дело в том что я не понимаю логики возникновения этих ошибок и следовательно не вижу потенциальных путей их решения.
Тем самым я избавлюсь от синтаксических ошибок- ошибок в коде, а логические ошибки- возникающие в ходе работы программы, типа 4107? Или в принципе способ с NormalizeDouble верен?
Дело в том что я не понимаю логики возникновения этих ошибок и следовательно не вижу потенциальных путей их решения.
4107 - да, NormalizeDouble
но и вы должны проверить. вдруг вы отрицательное число даете.
не ленитесь при ошибке выводить через Print все параметры в которых сомневаетесь. По другому вы не узнаете где ошибка
4108 - аналогично. проверьте через Print какой тикет вы пытаетесь передать.
4107 - да, NormalizeDouble
но и вы должны проверить. вдруг вы отрицательное число даете.
не ленитесь при ошибке выводить через Print все параметры в которых сомневаетесь. По другому вы не узнаете где ошибка
4108 - аналогично. проверьте через Print какой тикет вы пытаетесь передать.
Все. Исправил. Спасибо большое. Затруднение в том что OrderSend:
int NewOrder(int Cmd,double Lot)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(Cmd==OP_BUY)
{
PR=Ask;
if(TakeProfit>0)TP=Ask+TakeProfit*Point;
if(StopLoss>0)SL=Bid-StopLoss*Point;
}
if(Cmd==OP_SELL)
{
PR=Bid;
if(TakeProfit>0)TP=Bid-TakeProfit*Point;
if(StopLoss>0)SL=Ask+StopLoss*Point;
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,5,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError());
return(tic);
}
возвращает ошибки 4107 и 4108. Исправил с применением NormalizeDouble:
int NewOrder(int Cmd,double Lot,int slip)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(Cmd==OP_BUY)
{
PR=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK), Digits);
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK)+TakeProfit*Point;
if(StopLoss>0)SL=NormalizeDouble(MarketInfo(Symbol(),MODE_BID)-StopLoss*Point;
}
if(Cmd==OP_SELL)
{
PR=NormalizeDouble(MarketInfo(Symbol(),MODE_BID), Digits);
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_BID)-TakeProfit*Point;
if(StopLoss>0)SL=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK)+StopLoss*Point;
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,slip,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError());
return(tic);
}
Но теперь при коипиляции выдается: "'\end_of_program' - unbalanced left parenthesis (197, 1)" и непонятно действует ли вообще мое нововведение
ну посмотрите внимательно - у Вас -
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK ) +TakeProfit*Point; if(StopLoss>0)SL =NormalizeDouble(MarketInfo(Symbol(),MODE_BID ) -StopLoss*Point;перед MarketInfo открывается скобка - а закрывается она где? длжно быть так -
if(TakeProfit>0)TP=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK )) +TakeProfit*Point; if(StopLoss>0)SL =NormalizeDouble(MarketInfo(Symbol(),MODE_BID )) -StopLoss*Point;
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
При работе советника регулярно возникают ошибки Invalid ticket for OrderClose function.
Функция закрывающая ордера:
void CloseOrder()
{
double PR=0;
while(!IsTradeAllowed()) Sleep(100);
if(OrderType()==OP_BUY) PR=Bid;
if(OrderType()==OP_SELL) PR=Ask;
if(!OrderClose(OrderTicket(),OrderLots(),PR,3,CLR_NONE))
Print("Ошибка закрытия ордера: ",GetLastError());
return;
}
Весь код в файле.
Господа, обьясните пожалуйста четко и ясно в чем принципиальная неверность данного кода и как лучше реализовать закрытие ордеров.