Вот что в коде:
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);
Как раз 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]. Кто может объяснтиь смысл такой конструкции, поможет ли она в решении проблемы с реквотами.
Спасибо
Как сделать чтоб оператор, посылающий приказ на закрытие, не передавал управление следующему, пока не закрылся ордер.
Почитайте здесь Учебник по MQL4 Торговые операции Открытие и установка ордеров . Там есть такая фраза (выделено в рамочку):
Вопросы отношения клиентского терминала с сервером описаны в разделе Учебник по MQL4 Торговые операции Общий порядок проведения торговых операций . Там тоже написано:
Помогите пожалуйста! Как осуществить привязку ко времени.Например, чтобы советник анализировал ситуацию,и выполнял покупку- продажу один раз в сутки в 11 часов вечера.Заранее благодарен.
Как сделать чтоб оператор, посылающий приказ на закрытие, не
передавал управление следующему, пока не закрылся ордер.
Почитайте здесь Учебник по MQL4 Торговые операции Открытие и установка ордеров
. Там есть такая фраза (выделено в рамочку):
никаких действий - программа находилась в режиме ожидания ответа
сервера.
Вопросы отношения клиентского терминала с сервером описаны
в разделе Учебник по 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).
Скорее всего ордер закроется, правда далеко не всегда по нужной цене.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
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