Вопрос к разработчикам: Советник не закрывает ордера. - страница 2

 
Scriptong писал (а) >>
А я вообще не понимаю, как можно закрывать ордер по цене закрытия OrderClosePrice(), которая будет иметь вменяемое значение только после закрытия позиции. До этого в ней будет просто 0. Здесь уж никакой слиппадж не спасет.

Угу, закрываем по непонятной цене закрытия непонятного ордера, и главное иногда закрывается!

 
Rosh писал (а) >>

Кстати, только что к своему стыду обратил внимание - а где выбор необходимого ордера через OrderSelect(). Насколько корректно в данной функции использовать OrderClosePrice() без вызова OrderSelect(). Где гарантия, что использование OrderClosePrice() корректно?

Функция Close() гарантированно вызывается только в случае успешного выполнения функции OrderSelect().

Иначе бы функция генерировала бы код ошибки 129 (Неправильная цена) а не 0.

 
Scriptong писал (а) >>
А я вообще не понимаю, как можно закрывать ордер по цене закрытия OrderClosePrice(), которая будет иметь вменяемое значение только после закрытия позиции. До этого в ней будет просто 0. Здесь уж никакой слиппадж не спасет.

Если бы было так как Вы пишете, то функция OrderClose() генерировала бы код ошибки 129 (Неправильная цена), а не 0 (Нет ошибки).

 
bool close(int ticket)
{
   bool isClosed = false;
   int try = 0;
   
   OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
   if(OrderType()==0)
   isClosed = OrderClose(OrderTicket(), OrderLots(),Bid, 3, 0); 
   
   if(OrderType()==1)
   isClosed = OrderClose(OrderTicket(), OrderLots(),Ask, 3, 0); 
   
   while(!isClosed) 
   {
      Sleep(3000);
      try++;
      if(!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))break;
      
      if(OrderType()==0)
      isClosed = OrderClose(OrderTicket(), OrderLots(),Bid, 3, 0); 
      
      if(OrderType()==1)
      isClosed = OrderClose(OrderTicket(), OrderLots(),Ask, 3, 0); 
      
      if(try > 3) break;
   }
   if(!isClosed) Print("Order ", ticket, " was NOT closed due to error:", GetLastError());
   return (isClosed);
}
Файлы:
buyclose.mq4  3 kb
 

Кстати, в справке здесь дан пример не той функции...

 
bablokos писал (а) >>

Если бы было так как Вы пишете, то функция OrderClose() генерировала бы код ошибки 129 (Неправильная цена), а не 0 (Нет ошибки).

Ок, если не верите мне, попробуйте сами нехитрый код. Что он вам выдаст?

int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 10, 0, 0, NULL, 0);
if(ticket > 0)
 {
  OrderSelect(ticket, SELECT_BY_TICKET);
  Print("Цена закрытия ", OrderClosePrice());
 }

Вы увидите, что до закрытия позиции ее цена закрытия равна нулю. Вы же пытаетесь закрывать все позиции по цене 0. Я сильно удивлен, что ваш советник закрывает позиции.

Если у вас действительно все позиции закрываются по цене ноль, то стоит наоткрываться вкороткую по всем валютам и тут же все их закрыть по такой чудесной цене. Вы переплюнете Сороса и Баффета вместе взятых.

 

 
Scriptong писал (а) >>

Ок, если не верите мне, попробуйте сами нехитрый код. Что он вам выдаст?

Вы увидите, что до закрытия позиции ее цена закрытия равна нулю. Вы же пытаетесь закрывать все позиции по цене 0. Я сильно удивлен, что ваш советник закрывает позиции.

Если у вас действительно все позиции закрываются по цене ноль, то стоит наоткрываться вкороткую по всем валютам и тут же все их закрыть по такой чудесной цене. Вы переплюнете Сороса и Баффета вместе взятых.

Пожалуйста,
Вот код советника:

#property copyright "bablokos"
#property link ""
int ticket;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+

int init()
{
//----
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 10, 0, 0, NULL, 0);
OrderSelect(ticket, SELECT_BY_TICKET);
Print("Open Price ", OrderClosePrice());

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
if(ticket > 0)
{
static datetime prevtime;

if(iTime(Symbol(), NULL, 0) == prevtime)
return(0);
prevtime = iTime(Symbol(), NULL, 0);


OrderSelect(ticket, SELECT_BY_TICKET);
Print("Close Price ", OrderClosePrice());
}
//----
return(0);
}
//+------------------------------------------------------------------+


А вот его лог:

23:00:23 Test started for testing
23:00:23 2008.08.06 00:04 Test EURUSD,H1: open #1 buy 0.10 EURUSD at 1.5452 ok
23:00:23 2008.08.06 00:04 Test EURUSD,H1: Open Price 1.545
23:00:23 2008.08.06 00:04 Test EURUSD,H1: Close Price 1.545
23:00:23 2008.08.06 01:01 Test EURUSD,H1: Close Price 1.5461
23:00:23 2008.08.06 02:00 Test EURUSD,H1: Close Price 1.5465
23:00:23 2008.08.06 03:00 Test EURUSD,H1: Close Price 1.5471
23:00:23 2008.08.06 04:00 Test EURUSD,H1: Close Price 1.5479
23:00:23 2008.08.06 05:00 Test EURUSD,H1: Close Price 1.5482
23:00:23 2008.08.06 06:00 Test EURUSD,H1: Close Price 1.5494
23:00:23 2008.08.06 07:00 Test EURUSD,H1: Close Price 1.5496
23:00:23 2008.08.06 08:00 Test EURUSD,H1: Close Price 1.5496
23:00:23 2008.08.06 09:00 Test EURUSD,H1: Close Price 1.5509
23:00:23 2008.08.06 10:00 Test EURUSD,H1: Close Price 1.5497
23:00:23 2008.08.06 11:00 Test EURUSD,H1: Close Price 1.5475
23:00:23 2008.08.06 12:00 Test EURUSD,H1: Close Price 1.5482
23:00:23 2008.08.06 13:00 Test EURUSD,H1: Close Price 1.5468
23:00:23 2008.08.06 14:00 Test EURUSD,H1: Close Price 1.5481
23:00:23 2008.08.06 15:00 Test EURUSD,H1: Close Price 1.5456
23:00:23 2008.08.06 16:00 Test EURUSD,H1: Close Price 1.5421
23:00:23 2008.08.06 17:00 Test EURUSD,H1: Close Price 1.5418
23:00:23 2008.08.06 18:00 Test EURUSD,H1: Close Price 1.5409
23:00:23 2008.08.06 19:00 Test EURUSD,H1: Close Price 1.543
23:00:23 2008.08.06 20:00 Test EURUSD,H1: Close Price 1.5419
23:00:23 2008.08.06 21:00 Test EURUSD,H1: Close Price 1.5415
23:00:23 2008.08.06 22:00 Test EURUSD,H1: Close Price 1.5413
23:00:23 2008.08.06 23:00 Test EURUSD,H1: Close Price 1.5406
23:00:23 2008.08.07 00:00 Test EURUSD,H1: Close Price 1.5413
23:00:23 2008.08.07 01:00 Test EURUSD,H1: Close Price 1.5415
23:00:23 2008.08.07 02:00 Test EURUSD,H1: Close Price 1.5421
23:00:23 2008.08.07 03:00 Test EURUSD,H1: Close Price 1.543
23:00:23 2008.08.07 04:01 Test EURUSD,H1: Close Price 1.5434
23:00:23 2008.08.07 05:00 Test EURUSD,H1: Close Price 1.5433
23:00:23 2008.08.07 06:00 Test EURUSD,H1: Close Price 1.5431
23:00:23 2008.08.07 07:00 Test EURUSD,H1: Close Price 1.544
23:00:23 2008.08.07 08:00 Test EURUSD,H1: Close Price 1.5444
23:00:23 2008.08.07 09:00 Test EURUSD,H1: Close Price 1.5472
23:00:23 2008.08.07 10:00 Test EURUSD,H1: Close Price 1.5465
23:00:23 2008.08.07 11:00 Test EURUSD,H1: Close Price 1.5473
23:00:23 2008.08.07 12:00 Test EURUSD,H1: Close Price 1.5469
23:00:23 2008.08.07 13:00 Test EURUSD,H1: Close Price 1.5466
23:00:23 2008.08.07 14:00 Test EURUSD,H1: Close Price 1.5468
23:00:23 2008.08.07 15:00 Test EURUSD,H1: Close Price 1.5413
23:00:23 2008.08.07 16:00 Test EURUSD,H1: Close Price 1.5386
23:00:23 2008.08.07 17:00 Test EURUSD,H1: Close Price 1.5375
23:00:23 2008.08.07 18:00 Test EURUSD,H1: Close Price 1.534
23:00:23 2008.08.07 19:00 Test EURUSD,H1: Close Price 1.5324
23:00:23 2008.08.07 20:00 Test EURUSD,H1: Close Price 1.5326
23:00:23 2008.08.07 21:00 Test EURUSD,H1: Close Price 1.5325
23:00:23 2008.08.07 22:00 Test EURUSD,H1: Close Price 1.5321
23:00:23 2008.08.07 23:00 Test EURUSD,H1: Close Price 1.5323
23:00:23 2008.08.07 23:59 Tester: order #1 is closed

 

Вопрос об OrderClosePrice уже поднимался. Это цена, по которой возможно в данный момент закрыть ордер. Посмотрите внимательно на лог и терминал - это цены начала баров (т.е. Open).

 
Parabellum писал (а) >>

Вопрос об OrderClosePrice уже поднимался. Это цена, по которой возможно в данный момент закрыть ордер. Посмотрите внимательно на лог и терминал - это цены начала баров (т.е. Open).

Вы видите в логе цены Open потому что только они и распечатываются. Уберите из функции start() следующие строки

if(iTime(Symbol(), NULL, 0) == prevtime)
return(0);
prevtime = iTime(Symbol(), NULL, 0);

и Вы увидите в логе цену на каждом тике.

 
bablokos писал (а) >>

Вы видите в логе цены Open потому что только они и распечатываются. Уберите из функции start() следующие строки

if(iTime(Symbol(), NULL, 0) == prevtime)
return(0);
prevtime = iTime(Symbol(), NULL, 0);

и Вы увидите в логе цену на каждом тике.

Да, а я что сказал? Я знаю про этот трюк со входом на начале бара. Я не про это. ОрдерКлоузПрайс это в о з м о ж н а я цена. То есть по ней возможно закрыть в данный момент, теоретически, если сильно захотеть.

Причина обращения: