Сработал отложник - страница 2

 

Поправил слегка - для вашей ситуации


KSA4:

/+------------------------------------------------------------------+
//| $.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
/*
Открываем по одному ордеру OP_SELLSTOP и OP_BUYSTOP.
При срабатывании любого из них печатаем Print("OrderType ",OrderType());
но ордер срабатывает а принта нет.Почему ?
 
*/
int opnbuy=0;int opnsell=0;
 
int start()
{
if (opnbuy==0)
{
int TICKET_SELLSTOP=OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid-2*Point,4,0,0,"",0,0,0);
if(TICKET_SELLSTOP>0)
{
if(OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET,MODE_TRADES)==true)
{
Print("Открыт ",TICKET_SELLSTOP," ",OrderType()," ",OrderOpenPrice());
opnbuy=1;
}
else Print(OrderType()," не открыт, ошибка: ",GetLastError());
}
}
 
if (opnsell==0)
{
int TICKET_BUYSTOP=OrderSend(Symbol(),OP_BUYSTOP,0.1,Ask+2*Point,4,0,0,"",0,0,0);
if(TICKET_BUYSTOP>0)
{
if(OrderSelect(TICKET_BUYSTOP,SELECT_BY_TICKET,MODE_TRADES)==true)
{
Print("Открыт ",TICKET_BUYSTOP," ",OrderType()," ",OrderOpenPrice());
opnsell=1;
}
else Print(OrderType()," не открыт, ошибка: ",GetLastError());
}
}
 
///


// напишите ТАК
if (OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET,MODE_TRADES)==true )
   if ( OrderType()== OP_SELL )
       Print("OrderType ",OrderType()); // ура сработал ОТКРЫЛИСЬ
if (OrderSelect(TICKET_BUYSTOP,SELECT_BY_TICKET,MODE_TRADES)==true )
  if  ( OrderType()== OP_BUY )
      Print("OrderType ",OrderType()); /// ура сработал
// конец  мучений

 return(0);
}
 
Talex:
KSA4:

Учту. А что скажете по коду? Это только пример, но я хочу понять в чём ошибка.

Видимо ошибка в строках:

if(OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET,MODE_TRADES)==true)
и
if(OrderSelect(TICKET_BUYSTOP,SELECT_BY_TICKET,MODE_TRADES)==true)
bool OrderSelect( int index, int select, int pool=MODE_TRADES)
Параметры:
index - Позиция ордера или номер ордера в зависимости от второго параметра.
select - Флаг способа выбора. Mожет быть одним из следующих величин:
SELECT_BY_POS - в параметре index передается порядковый номер позиции в списке,
SELECT_BY_TICKET - в параметре index передается номер тикета.
pool -

Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:
MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.

это не ошибка - он ловит конкретные тикеты


так что все верно у него в коде, у него логика ошибочная была

 

2008.05.26 17:23:52 2008.05.26 00:39 Tester: order #1 is closed
2008.05.26 17:23:48 2008.05.26 00:00 Tester: order #1, sell 0.10 EURUSD is opened at 1.5767
2008.05.26 17:23:48 2008.05.26 00:00 $ EURUSD,M1: Открыт 2 4 1.5773
2008.05.26 17:23:48 2008.05.26 00:00 $ EURUSD,M1: open #2 buy stop 0.10 EURUSD at 1.5773 ok
2008.05.26 17:23:48 2008.05.26 00:00 $ EURUSD,M1: Открыт 1 5 1.5767
2008.05.26 17:23:48 2008.05.26 00:00 $ EURUSD,M1: open #1 sell stop 0.10 EURUSD at 1.5767 ok
2008.05.26 17:23:48 $ started for testing

В принтах деиствительно sellstop стал sell. Наверно ошибка в этой строке:

if (OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET)==true && OrderType()<2)Print("OrderType ",OrderType());
if (OrderSelect(TICKET_BUYSTOP,SELECT_BY_TICKET)==true && OrderType()<2)Print("OrderType ",OrderType());

Я ещё учусь и ошибку в упор не вижу. Если отложник сработал то должно выполнятся

Print("OrderType ",OrderType());

или любое другое действие, например открытие пользовательской функции, а этого нет.
 
YuraZ:

Поправил слегка - для вашей ситуации

KSA4:

/+------------------------------------------------------------------+
//| $.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
/*
Открываем по одному ордеру OP_SELLSTOP и OP_BUYSTOP.
При срабатывании любого из них печатаем Print("OrderType ",OrderType());
но ордер срабатывает а принта нет.Почему ?
 
*/
int opnbuy=0;int opnsell=0;
 
int start()
{
if (opnbuy==0)
{
int TICKET_SELLSTOP=OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid-2*Point,4,0,0,"",0,0,0);
if(TICKET_SELLSTOP>0)
{
if(OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET,MODE_TRADES)==true)
{
Print("Открыт ",TICKET_SELLSTOP," ",OrderType()," ",OrderOpenPrice());
opnbuy=1;
}
else Print(OrderType()," не открыт, ошибка: ",GetLastError());
}
}
 
if (opnsell==0)
{
int TICKET_BUYSTOP=OrderSend(Symbol(),OP_BUYSTOP,0.1,Ask+2*Point,4,0,0,"",0,0,0);
if(TICKET_BUYSTOP>0)
{
if(OrderSelect(TICKET_BUYSTOP,SELECT_BY_TICKET,MODE_TRADES)==true)
{
Print("Открыт ",TICKET_BUYSTOP," ",OrderType()," ",OrderOpenPrice());
opnsell=1;
}
else Print(OrderType()," не открыт, ошибка: ",GetLastError());
}
}
 
///


// напишите ТАК
if (OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET,MODE_TRADES)==true )
   if ( OrderType()== OP_SELL )
       Print("OrderType ",OrderType()); // ура сработал ОТКРЫЛИСЬ
if (OrderSelect(TICKET_BUYSTOP,SELECT_BY_TICKET,MODE_TRADES)==true )
  if  ( OrderType()== OP_BUY )
      Print("OrderType ",OrderType()); /// ура сработал
// конец  мучений

 return(0);
}

Проверил. Почему-то всё равно Print("OrderType ",OrderType()); /// ура сработал

не работает.

 
KSA4:

if ( OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET)==true && OrderType() <2 )



тут действительно смотришь вроде как срабатывать должно


тут два условия!


но последовательность проверки может давать ложь


// потому лучше последовательность задавать явно... так и код читается лучше

// к тому же лучше явно указать откуда вы хотите читать ордер т к если вы прийдете сюда с процедуры которая рылась по истории

// вы можете получить не то что хотели


if (OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET, MODE_TRADES )==true )

{

// и только теперь смотреть тип ордера, так надежней и нет причин мучаться а что первым отработало КАКОЕ из условий


}

 

Я продажи сделал вот так:

int opnbuy=0, TICKET_SELLSTOP;

void start() {
  if (opnbuy==0) {
    TICKET_SELLSTOP=OrderSend(Symbol(),OP_SELLSTOP,0.1,Bid-2*Point,4,0,0);
    if (TICKET_SELLSTOP>0) {
      if (OrderSelect(TICKET_SELLSTOP, SELECT_BY_TICKET)) {
        Print("Открыт ",TICKET_SELLSTOP," ",OrderType()," ",OrderOpenPrice());
        opnbuy=1;
      }
    } else Print(OrderType()," не открыт, ошибка: ",GetLastError());
  } else {
    if (OrderSelect(TICKET_SELLSTOP, SELECT_BY_TICKET)) {
      Print("Открыт ",TICKET_SELLSTOP," ",OrderType()," ",OrderOpenPrice());
    }
  }
}

Аналогично делайте для покупок. А вот записи из журнала:

 
YuraZ:
KSA4:

if ( OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET)==true && OrderType() <2 )



тут действительно смотришь вроде как срабатывать должно


тут два условия!

но последовательность проверки может давать ложь

// потому лучше последовательность задавать явно... так и код читается лучше

// к тому же лучше явно указать откуда вы хотите читать ордер т к если вы прийдете сюда с процедуры которая рылась по истории

// вы можете получить не то что хотели


if (OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET, MODE_TRADES )==true )

{

// и только теперь смотреть тип ордера, так надежней и нет причин мучаться а что первым отработало КАКОЕ из условий

}

Согласен, лучше сначала выделить с помощью OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET,MODE_TRADES)

а потом проверять, но ведь всёравно не работает.

В журнале печатает 2008.05.26 17:23:48 2008.05.26 00:00 Tester: order #1, sell 0.10 EURUSD is opened at 1.5767

отложник исполнился а Print("OrderType ",OrderType()); не выполняется, даже в исправленном варианте.

Проверьте может у вас получается?

 
KSA4:

Проверил. Почему-то всё равно Print("OrderType ",OrderType()); /// ура сработал

не работает.

фантастика - но жизнь слишком разнообразна


распринтовку!


// напишите ТАК
if (OrderSelect(TICKET_SELLSTOP,SELECT_BY_TICKET,MODE_TRADES)==true )
{
 
  Print(" ОЙ НЕ ФАКТ ЧТО МЫ СЮДА ПОПАЛИ "+ TICKET_SELLSTOP );
  OrderPrint(); // на всякий случай посмотрим ВСЕ что у нас открыто  

  if ( OrderType()== OP_SELL )
       Print("OrderType ",OrderType()); // ура сработал ОТКРЫЛИСЬ
  else
  {
     
       Print("ОТЛОЖКА OrderType ",OrderType());
 // еще живет отложка
  }
}
else
{
   // 
  Print(" КОСЯК  с номером тикета" );
}

if (OrderSelect(TICKET_BUYSTOP,SELECT_BY_TICKET,MODE_TRADES)==true )
{
  Print(" ОЙ НЕ ФАКТ ЧТО МЫ СЮДА ПОПАЛИ "+ TICKET_BUYSTOP );
 OrderPrint(); // на всякий случай посмотрим ВСЕ что у нас открыто

 if  ( OrderType()== OP_BUY )
      Print("OrderType ",OrderType()); /// ура сработал
  else
  {
       Print("ОТЛОЖКА OrderType ",OrderType());

     // еще живет отложка
  }

}
else
{
   // 
  Print(" КОСЯК  с номером тикета" );
}

// конец  мучений


Косяк нас может подстерегать если БРОКЕР присваивает ордерам новые ТИКЕТЫ

при частичном закрытии так и происходит

потому я бы на самом деле предпочел с тикетом работать ЛИШЬ в ситуации "ПОКА ОРДЕР ЖИВЕТ в своем неизменном состоянии"

т е зная - предполагая, что ордер отложенный ЕСТЬ, я ищу его по тикету

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


распринтовка покажет что к чему

 
KimIV, YuraZ Большое Спасибо. Буду разбираться.
Причина обращения: