[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 276

 
BBSL:

Если речь идет о тиках, то можно написать код сохраняющий днные файл, но в експерте нужно будет сделать загрузку из файла. Может есть смысл просто не выключать комп?
Видимо следует задействовать второй вариант. Спасибо, BBSL.
 
artmedia70:

Странно вы как-то делаете... При открытии позиции номер тикета присваиваете одной переменной, а проверяете совсем другую...

При этом OrderSend() в случае неудачи возвращает -1 (минус один), а вы проверяете на меньше единицы, когда нужно на меньше ноля

Это первое, что в глаза бросается. Но, думаю, у вас там много всего интересного... :)


У-га-га, да приколов много... Особенно когда начинаешь проверять))

Давайте, еще раз... Нужно так,

Открываю ордер:

order_id = OrderSend(Symbol(),OP_SELL,1.0,Bid,3,0,0,"expert comment",255,0,Red);
   if(order_id<0)
     {
      error=GetLastError();
      Print("send_orders, error = ",ErrorDescription(error));
      return;
     }
     } 

Закрываю ордер:

if(OrderSelect(0, SELECT_BY_POS)==true){

OrderClose(OrderTicket(),1,Bid,3,Red);

}

Правильно, при условии одного единственного ордера?))

 
hedger:
Видимо следует задействовать второй вариант. Спасибо, BBSL.

Пожалуйста, надеюсь это действительно Вам поможет))
 
artmedia70:

Странно вы как-то делаете... При открытии позиции номер тикета присваиваете одной переменной, а проверяете совсем другую...

При этом OrderSend() в случае неудачи возвращает -1 (минус один), а вы проверяете на меньше единицы, когда нужно на меньше ноля

Это первое, что в глаза бросается. Но, думаю, у вас там много всего интересного... :)


Я понял, номер тикита нужно получать вот так:

nomer_ticketa = OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"expert comment",255,0,Green);
   if(ticket<1)
 
artmedia70:

Странно вы как-то делаете... При открытии позиции номер тикета присваиваете одной переменной, а проверяете совсем другую...

При этом OrderSend() в случае неудачи возвращает -1 (минус один), а вы проверяете на меньше единицы, когда нужно на меньше ноля

Это первое, что в глаза бросается. Но, думаю, у вас там много всего интересного... :)


Respect, свасибо!))
 
BBSL:


Я понял, номер тикита нужно получать вот так:

Знаете, при наличии только одного ордера, может и пойдёт, но вот если ручками ещё открывать, то будет всё уже не так. Номер тикета нужно сохранять в переменной, а после выбора ордера сравнивать его тикет с запомненным:

 if (OrderTicket()==number_ticket) {
   // ... код для работы с выбранным ордером при совпадении тикетов
   }

А вообще, выбор ордеров нужно проводить ф-цией OrderSelect() в цикле:

for (i=0; i<OrdersTotal(); i++) {                    // цикл по всем рыночным ордерам терминала
   if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { // Если выбран любой рыночный ордер с индексом i
      if (OrderSymbol()!=Symbol())     continue;   // Если символ не текущего графика, переходим к выбору следующего ордера
      if (OrderMagicNumber()!=Magic)   continue;   // Если его магик не совпадает с магиком советника - переходим к выбору следующего
//... далее можно проверять другие параметры выбранного ордера, но в этом месте уже есть выбранный ордер текущего графика и номером магика советника
      if (OrderTicket()==number_ticket) {          // проверяем тикет выбранного ордера и, если есть совпадение, выполняем с ним дальнейшие действия
         // ... код, выполняющий дальнейшие действия с найденным нужным ордером ...
         }
      }
   else if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // Иначе, если не удалось выбрать ордер
      Print ("Ошибка при выборе ордера из списка рыночных ордеров = ", GetLastError());  // Выведем сообщение об ошибке и её номер в журнал.
   }

Это только пример для понимания, а не законченный рабочий код, если что... :)

 
artmedia70:

Знаете, при наличии только одного ордера, может и пойдёт, но вот если ручками ещё открывать, то будет всё уже не так. Номер тикета нужно сохранять в переменной, а после выбора ордера сравнивать его тикет с запомненным:

А вообще, выбор ордеров нужно проводить ф-цией OrderSelect() в цикле:

Это только пример для понимания, а не законченный рабочий код, если что... :)




При закрытии ордеров, если ордер не один, нужно использовать такой цикл:

int i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
 //...
 
bolt:

При закрытии ордеров, если ордер не один, нужно использовать такой цикл:

Читайте последнюю строку моего поста. Кто сказал, что я писал пример для закрытия?

Остальное - прописные истины. Напишите свой учебник.

 

Подскажите плиз, почему не работает OrderOpenPrice ? Задача - ищем в пуле ордер выставленный по определенной цене, если его там нет, ставим ордер и ставим флаг что он установлен.


for(int i=1 ; i <= OrdersTotal() ; i++)
   {
   if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES))
      {
      if(OrderOpenPrice() == price) 
        {
        orderset = true;
        }
      }
   }
     
if((orderset==false)
   {
   OrderSend(Symbol(),OP_SELLLIMIT,baselot,price,3,NULL,price-10,"Comment",0001+i,0,White); 
   }
 
Pyro:

Подскажите плиз, почему не работает OrderOpenPrice ? Задача - ищем в пуле ордер выставленный по определенной цене, если его там нет, ставим ордер и ставим флаг что он установлен.



Нельзя сравнивать действительные числа.
Причина обращения: