Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 642

 
paylesss:

Cпасибо!Помогла перезагрузка компа!Обидно, целое утро сижу)) 

а вот теперь тем более актуален билд терминала и желательно пошагово вспомнить что такого вы сделали, что глоб.переменные отвалились. Если возможно повторить ситуацию - было бы вообще замечательно.

 
Kirill Andreev:

написал сову , но почему то не работает трейлинг стоп... в чем может быть причина?

чтоб он работал его надо запихнуть в OnTick
 
Vladislav Andruschenko:
чтоб он работал его надо запихнуть в OnTick
Спасибо, попробую!!!
 

Здравствуйте.

Помогите, пожалуйста, хочу модифицировать все позиции кроме последней, самой “молодой”. Где единичку прибавить или отнять?


 int i; total = OrdersTotal();
          for(i = 0; i < total; i++)
             {
              if(OrderSelect(i, SELECT_BY_POS)   && OrderLots() == _Lots)
              {
              if (OrderType()==OP_BUY) 
              {
              if (OrderOpenPrice()!=OrderStopLoss()) 
              {
              ModifyOrder(-1,OrderOpenPrice() , -1);
              }
             } 
            }  
           }
 
mila.com:

Здравствуйте.

Помогите, пожалуйста, хочу модифицировать все позиции кроме последней, самой “молодой”. Где единичку прибавить или отнять?



 int i; total = OrdersTotal();
          for(i = 0; i < total-1; i++)
             {
              if(OrderSelect(i, SELECT_BY_POS)   && OrderLots() == _Lots)
              {
              if (OrderType()==OP_BUY) 
              {
              if (OrderOpenPrice()!=OrderStopLoss()) 
              {
              ModifyOrder(-1,OrderOpenPrice() , -1);
              }
             } 
            }  
           }


 
-Aleks-:
int i; total = OrdersTotal();
          for(i = 0; i < total-1; i++)
             {
              if(OrderSelect(i, SELECT_BY_POS)   && OrderLots() == _Lots)
              {
              if (OrderType()==OP_BUY) 
              {
              if (OrderOpenPrice()!=OrderStopLoss()) 
              {
              ModifyOrder(-1,OrderOpenPrice() , -1);
              }
             } 
            }  
           }

Вы уверены, что показали надёжный способ пропуска последней позиции в списке?

Если торговать реально, то не беспокоит, что от сортировки может вдруг появиться зависимость?

Всё же, ИМХО, тут нужны два цикла - в первом ищем по времени открытия самую свежую позицию, во втором модифицируем все, кроме той, тикет которой нашли в первом цикле.

 
mila.com:

Здравствуйте.

Помогите, пожалуйста, хочу модифицировать все позиции кроме последней, самой “молодой”. Где единичку прибавить или отнять?


Я-бы сделал так.

/********************Script program start function********************/
void OnStart()
{
 int i, t1, t2, clTicket, total = OrdersTotal();
  datetime d1, d2;
   double v1, v2, clVolume;
    for(i = total-1; i > 0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS))
       {
        t1 = OrderTicket();
         d1 = OrderOpenTime();
        v1 = OrderLots();
       }
      else continue;
        if(OrderSelect(i-1, SELECT_BY_POS))
         {
          t2 = OrderTicket();
           d2 = OrderOpenTime();
          v2 = OrderLots();
         }
        else continue;
        clTicket = d1 > d2 ? t1 : t2;
       clVolume = d1 > d2 ? v1 : v2;
      if(!OrderClose(clTicket, clVolume, OrderClosePrice(), 100)) // закрывает независимо от типа ордера OP_BUY или OP_SELL
       Print("фигня кака-та");
    }
}/********************************************************************/

К сожалению это не проверено и что-то не могу сообразить возможен-ли вариант когда после закрытия очередного ордера образуется "дыра" в списке ордеров.

Если кто сможет объяснить возможность появления такой "дыры" буду благодарен...

Для страховки вставлено else continue; если будет дыра, то будет просто пропущен один ордер. Так мне кажется.

 
Alexey Viktorov:

Я-бы сделал так.

К сожалению это не проверено и что-то не могу сообразить возможен-ли вариант когда после закрытия очередного ордера образуется "дыра" в списке ордеров.

Если кто сможет объяснить возможность появления такой "дыры" буду благодарен...

Для страховки вставлено else continue; если будет дыра, то будет просто пропущен один ордер. Так мне кажется.

Изначально вопрос стоял в том, чтобы пропустить последний ордер. А Вы с него и начинаете.

Нужно сделать так:

for(int i = total-2; i >= 0; i--)

Тогда после удаления не будет никаких пропусков и самый свежий ордер будет пропущен.

 
Alexey Kozitsyn:

Изначально вопрос стоял в том, чтобы пропустить последний ордер. А Вы с него и начинаете.

Нужно сделать так:

Тогда после удаления не будет никаких пропусков и самый свежий ордер будет пропущен.

Не последней по списку, а самой "молодой" по времени.

Хотя и я так-же не внимателен. Вопрос о модификации, а я пишу закрытие... А если просто модифай то и дыр никаких в списке ордеров не будет... Только может потребоваться добавить переменные и им присвоить значения и ОБЯЗАТЕЛЬНО проверку параметров, чтобы не получать ошибку #1. Ну с этим Мила сама справится.

 
Alexey Kozitsyn:

Изначально вопрос стоял в том, чтобы пропустить последний ордер. А Вы с него и начинаете.

Нужно сделать так:

for(int i = total-2; i >= 0; i--)

Тогда после удаления не будет никаких пропусков и самый свежий ордер будет пропущен.

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

Ещё раз повторю: для надёжного нахождения именно последнего ордера, его нужно определить по времени открытия, а не по позиции в списке.

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