Почему тикет не тот, и профит не отображается?

 
Вот что в коде:
priceClose=MarketInfo(OrderSymbol(),MODE_ASK);
OrderClose(ticket,OrderLots(),priceClose,slippage,Red);
Print("Закрыт ордер# ",ticket,OrderProfit()," ExpertMagic ",MagicNumber);
и вот что при выполнении получаем:
15:41:03 GBPUSD,M5: close #18320025 sell 1.00 GBPUSD at 1.9874 at price 1.9847
15:41:03 GBPUSD,M5: Закрыт ордер# 18320025270 ExpertMagic 20010
Почему тикет не тот, и профит не отображается? Все это в цикле оператора switch
 
mr_Johns писал (а): 15:41:03 GBPUSD,M5: Закрыт ордер# 18320025270 ExpertMagic 20010
Профит я выделил жирным. Он у тебя слился с тикетом (сам виноват). Как раз 27 пунктов при лоте 1.
 
mr_Johns:
Вот что в коде:
priceClose=MarketInfo(OrderSymbol(),MODE_ASK);
OrderClose(ticket,OrderLots(),priceClose,slippage,Red);
Print("Закрыт ордер# ",ticket,OrderProfit()," ExpertMagic ",MagicNumber);
и вот что при выполнении получаем:
15:41:03 GBPUSD,M5: close #18320025 sell 1.00 GBPUSD at 1.9874 at price 1.9847
15:41:03 GBPUSD,M5: Закрыт ордер# 18320025270 ExpertMagic 20010
Почему тикет не тот, и профит не отображается? Все это в цикле оператора switch



18320025270 тикет и профит лепятся в одну кучу, switch не при делах

Не нравится? Сделайте так :

Print("Закрыт ордер# ",ticket,"  Профит составил = ",OrderProfit()," ExpertMagic ",MagicNumber);
 
Mathemat:
mr_Johns писал (а): 15:41:03 GBPUSD,M5: Закрыт ордер# 18320025270 ExpertMagic 20010
Профит я выделил жирным. Он у тебя слился с тикетом (сам виноват).
Как раз 27 пунктов при лоте 1.
 
да, спасибо, всем. Я разобрался, прошу извинить, за такой нелепый вопрос.
Меня сейчас беспокоит, другой вопрос: как решить проблему с реквотами. Иногда возникает такая ситуация(частенько при хорошем движении):
15:40:39: close order #18322610 sell 2.00 GBPUSD at 1.9896 sl: 0.0000 tp: 0.0000 at price 1.9846
15:40:57: request was accepted by server
15:40:59: requote 1.9827 / 1.9831 for order #18322610 sell 2.00 GBPUSD closing at 1.9846
15:41:00: close order #18320025 sell 1.00 GBPUSD at 1.9874 sl: 0.0000 tp: 0.0000 at price 1.9847
15:41:00: request was accepted by server
15:41:00: request in process
15:41:03: order #18320025 sell 1.00 GBPUSD at 1.9874 sl: 0.0000 tp: 0.0000 closed at price 1.9847
15:42:03: delete pending order #18323335 buy stop 2.00 GBPUSD at 1.9956 sl: 0.0000 tp: 0.0000
15:42:06: request was accepted by server
Результат- один ордер закрыт, второй остался в рынке. Закрытие по суммарному профиту, т.е. в следущий проход функция не вызывается. Как сделать чтоб оператор, посылающий приказ на закрытие, не передавал управление следующему, пока не закрылся ордер. Где то я встречал  такую конструкцию:
if(Time[0] == prevtime)
return(0);
prevtime = Time[0];
if(IsTradeAllowed())
{
RefreshRates();
spread = MarketInfo(Symbol(), MODE_SPREAD);
}
else
{
prevtime = Time[1];
return(0);
}
...и далее
OrderClose(prevticket, OrderLots(), Bid, 3, Blue);
Sleep(30000);
prevtime = Time[1];

То есть после всякого обращения к серверу перменной prevtime присвается значение Time[1]. Кто может объяснтиь смысл такой конструкции, поможет ли она в решении проблемы с реквотами.
Спасибо
 
mr_Johns:
Как сделать чтоб оператор, посылающий приказ на закрытие, не передавал управление следующему, пока не закрылся ордер.

Почитайте здесь Учебник по MQL4 Торговые операции Открытие и установка ордеров . Там есть такая фраза (выделено в рамочку):

Обратите внимание, в период с п.4.2 по п.4.7 в программе не производилось никаких действий - программа находилась в режиме ожидания ответа сервера.

Вопросы отношения клиентского терминала с сервером описаны в разделе Учебник по MQL4 Торговые операции Общий порядок проведения торговых операций . Там тоже написано:

С момента, когда программа отдаёт торговый приказ (и одновременно с этим передаёт управление) клиентскому терминалу, до момента, кода управление возвращается в программу, программа находится в режиме ожидания ответа. В этот период в программе не осуществляется никаких действий. Управление возвращается в программу в соответствии с правилом исполнения вызова функции (сформировавшей торговый приказ).
 

Помогите пожалуйста! Как осуществить привязку ко времени.Например, чтобы советник анализировал ситуацию,и выполнял покупку- продажу один раз в сутки в 11 часов вечера.Заранее благодарен.

 
SK. писал (а):
mr_Johns:

Как сделать чтоб оператор, посылающий приказ на закрытие, не
передавал управление следующему, пока не закрылся ордер.


Почитайте здесь Учебник по MQL4 Торговые операции Открытие и установка ордеров
. Там есть такая фраза (выделено в рамочку):



Обратите внимание, в период с п.4.2 по п.4.7 в программе не производилось
никаких действий - программа находилась в режиме ожидания ответа
сервера.

Вопросы отношения клиентского терминала с сервером описаны
в разделе Учебник по MQL4 Торговые операции Общий порядок проведения торговых
операций
. Там тоже написано:



С момента, когда программа отдаёт торговый приказ (и одновременно
с этим передаёт управление) клиентскому терминалу, до момента,
кода управление возвращается в программу, программа находится
в режиме ожидания ответа. В этот период в программе не осуществляется
никаких действий. Управление возвращается в программу в соответствии
с правилом исполнения вызова функции (сформировавшей торговый
приказ).
Я взял у Роша функцию закрытия и удаления всех ордеров и переделал немножко, чтоб закрывались только селл или бай, сделал две функции:
void FixBuyProfit()
{
int i;
int total=OrdersTotal();
int ordertype;
if(total==0) {Alert("нет ордеров для закрытия-удаления"); return;}
int ticket;
double priceClose;
//----
if(IsTradeAllowed())
{
RefreshRates();
for(i=total-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
if(OrderMagicNumber()==MagicNumber)
{
if(OrderProfit()>0)
{
ordertype=OrderType();
ticket=OrderTicket();
switch(ordertype)
{
case 0:
priceClose=MarketInfo(OrderSymbol(),MODE_BID);
OrderClose(ticket,OrderLots(),priceClose,slippage,Blue);
Print("Закрыт ордер# ",ticket," ExpertMagic ",MagicNumber,": фиксируем прибыль ",OrderProfit());
break;
}
}
}
}
}

return;
}
И вот что реально получил сегодня на сервере Лайтфорекса (счет микро):
15:40:39: close order #18322610 sell 2.00 GBPUSD at 1.9896 sl: 0.0000 tp: 0.0000 at price 1.9846
15:40:57: request was accepted by server
15:40:59: requote 1.9827 / 1.9831 for order #18322610 sell 2.00 GBPUSD closing at 1.9846
15:41:00: close order #18320025 sell 1.00 GBPUSD at 1.9874 sl: 0.0000 tp: 0.0000 at price 1.9847

15:41:00: request was accepted by server
15:41:00: request in process
15:41:03: order #18320025 sell 1.00 GBPUSD at 1.9874 sl: 0.0000 tp: 0.0000 closed at price 1.9847
Вот не пойму (выделено) все правильно работает?, т.е. получили реквот и берем следующий ордер. Не врубаюсь, в коде есть ошибка?
 
Да, происходит переход к следующему ордеру, ведь предыдущий закрыть не удалось из-за реквота, а обработки ошибок нет.
Чтобы пытаться закрыть ордер до "посинения", нужно проверять результат функции закрытия и окончить попытки закрытия только при успешной отработке.  
Но это тоже неправильно, так как можно подвесить терминал или получить бан от сервера на несколько минут. Если нужно закрыть ордер во что бы то ни стало,  поставьте параметр slippage побольше (я во всех прогах ставлю 10).  
Скорее всего ордер закроется, правда далеко не всегда по нужной цене.