Приветствую народ. Очень нужна помощь, нужно реализовать компенсаторный ордер - страница 2

 
dmitri58_mql5:

вот и искусство  локирование есть

http://dewinforex.com/ru/osnovy-foreks/iskusstvo-lokirovaniia-gramotno-vykhodim-iz-zamka.html


https://nalivator.com/articles/lokirovanie-pravilnyy-vykhod-iz-loka

Локирование - Правильный выход из лока на форекс и фондовом рынке
  • nalivator.com
В этой статье мы поговорим о таком скользком вопросе, как применение локирования в торговле на рынке форекс, а также предложим варианты выхода из лока. Что такое локирование Положительный лок (локирование) Отрицательный лок (локирование) Нулевой лок (локирование) Особенности вывода сделки из локирования Варианты тактики выхода из лока Итоги...
 
dmitri58_mql5:  я продолжу разрабатывать компенсаторный ордер и  доведу до совершенства.

Видите, это называется ЛОК, ЗАМОК, ... компенсаторный - это новое название старого ржавого велосипеда. Вы говорите о сохранности средств. А закрытие любого ордера приводит к изменению депозита, средства остаются без изменения. Проверьте на демо

 
STARIJ:

Видите, это называется ЛОК, ЗАМОК, ... компенсаторный - это новое название старого ржавого велосипеда. Вы говорите о сохранности средств. А закрытие любого ордера приводит к изменению депозита, средства остаются без изменения. Проверьте на демо


депа имел в виду.

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

 
STARIJ:

Видите, это называется ЛОК, ЗАМОК, ... компенсаторный - это новое название старого ржавого велосипеда. Вы говорите о сохранности средств. А закрытие любого ордера приводит к изменению депозита, средства остаются без изменения. Проверьте на демо


если владеете программированием на mql4 , то прошу помощи : как сравнить два открытых OrderTicket()?
 
dmitri58_mql5:   если владеете программированием на mql4 , то прошу помощи : как сравнить два открытых OrderTicket()?

OrderTicket() - это функция. Возвращает номер тикета текущего выбранного ордера. Ордер должен быть предварительно выбран (сделан текущим) с помощью функции OrderSelect().  Открыт может быть ордер. Что конкретно Вы хотите сравнить?

Если Вы хотите сравнить тикеты двух открытых ордеров, то нужно выбрать один ордер и запомнить его тикет Т1=OrderTicket()  затем выбрать второй ордер и сравнить

if( Т1==OrderTicket() ) ...

 
STARIJ:

OrderTicket() - это функция. Возвращает номер тикета текущего выбранного ордера. Ордер должен быть предварительно выбран (сделан текущим) с помощью функции OrderSelect().  Открыт может быть ордер. Что конкретно Вы хотите сравнить?

Если Вы хотите сравнить тикеты двух открытых ордеров, то нужно выбрать один ордер и запомнить его тикет Т1=OrderTicket()  затем выбрать второй ордер и сравнить

if( Т1==OrderTicket() ) ...

нужно сравнить цену открытия двух ордеров (типа так: если уже существует ордер с ценой Р, то по этой цене нельзя больше открывать ордер), спасибо за подсказку. Чтот я сам не догадался что нужно запомнить тикет первого и сравнивать.

 

А вообще идея такова: если есть ордер у которого OrderProfit()<=OrderLots()*L*(-1)    ( L - это задаваемый параметр убытка в пунктах), то открывает новый ордер противоположный другому. Эту функцию я написал. 

Самая проблема у меня в том, что  ордера открываются бесконечное количество раз, насколько позволяет депозит. А нужно так: если у убыточного ордера уже открыт противоположный, то больше не открывать. И  если этот противоположный закрыть по безубытку (снова убыточный ордер остается без своего компенсаторного при условии, что у убыточного убыток больше либо равно OrderLots()*L*(-1) ) , то снова открыть противоположный. Вот с такой проблемой борюсь.

void CompensatorOrders()
{
  int    Type;
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if (OrderSymbol()==Symbol())
      double OOP = NormalizeDouble(OrderOpenPrice(),Digits);
      Type=OrderType();
      {
        if (Type==OP_BUY)
        {
          if (L!=0 && OrderProfit()<=OrderLots()*L*(-1))   // или так Bid<=OOP-L*Point)
          if(OrderSend(Symbol(),OP_SELL,OrderLots(),Bid,7,0,0,"Reverse",0,0,CLR_NONE)) return;
        }
        if (Type==OP_SELL)
        {
          if (L!=0 && OrderProfit()<=OrderLots()*L*(-1))   // или так Ask>=OOP+L*Point)
          if(OrderSend(Symbol(),OP_BUY,OrderLots(),Ask,7,0,0,"Reverse",0,0,CLR_NONE)) return;
        }
      }
    }
  }
}

 
dmitri58_mql5:

А вообще идея такова: если есть ордер у которого OrderProfit()<=OrderLots()*L*(-1)    ( L - это задаваемый параметр убытка в пунктах), то открывает новый ордер противоположный другому. Эту функцию я написал. 

Самая проблема у меня в том, что  ордера открываются бесконечное количество раз, насколько позволяет депозит. А нужно так: если у убыточного ордера уже открыт противоположный, то больше не открывать. И  если этот противоположный закрыть по безубытку (снова убыточный ордер остается без своего компенсаторного при условии, что у убыточного убыток больше либо равно OrderLots()*L*(-1) ) , то снова открыть противоположный. Вот с такой проблемой борюсь.

void CompensatorOrders()
{
  int    Type;
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if (OrderSymbol()==Symbol())
      double OOP = NormalizeDouble(OrderOpenPrice(),Digits);
      Type=OrderType();
      {
        if (Type==OP_BUY)
        {
          if (L!=0 && OrderProfit()<=OrderLots()*L*(-1))   // или так Bid<=OOP-L*Point)
          if(OrderSend(Symbol(),OP_SELL,OrderLots(),Bid,7,0,0,"Reverse",0,0,CLR_NONE)) return;
        }
        if (Type==OP_SELL)
        {
          if (L!=0 && OrderProfit()<=OrderLots()*L*(-1))   // или так Ask>=OOP+L*Point)
          if(OrderSend(Symbol(),OP_BUY,OrderLots(),Ask,7,0,0,"Reverse",0,0,CLR_NONE)) return;
        }
      }
    }
  }
}

вместо (или вместе) с "Reverse" запишите  в коммент тикет ордера который локируете. Тогда всё можно будет легко найти.

а вообще - это всё полумеры :-) надо в своём советнике поддерживать базу (список/таблицу) его ордеров. и в ней держать всю необходимую в работе информацию.

 
dmitri58_mql5:

А вообще идея такова: если есть ордер у которого OrderProfit()<=OrderLots()*L*(-1)    ( L - это задаваемый параметр убытка в пунктах), то открывает новый ордер противоположный другому. Эту функцию я написал. 

Самая проблема у меня в том, что  ордера открываются бесконечное количество раз, насколько позволяет депозит. А нужно так: если у убыточного ордера уже открыт противоположный, то больше не открывать. И  если этот противоположный закрыть по безубытку (снова убыточный ордер остается без своего компенсаторного при условии, что у убыточного убыток больше либо равно OrderLots()*L*(-1) ) , то снова открыть противоположный. Вот с такой проблемой борюсь.

void CompensatorOrders()
{
  int    Type;
  for (int i=OrdersTotal()-1; i>=0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if (OrderSymbol()==Symbol())
      double OOP = NormalizeDouble(OrderOpenPrice(),Digits);
      Type=OrderType();
      {
        if (Type==OP_BUY)
        {
          if (L!=0 && OrderProfit()<=OrderLots()*L*(-1))   // или так Bid<=OOP-L*Point)
          if(OrderSend(Symbol(),OP_SELL,OrderLots(),Bid,7,0,0,"Reverse",0,0,CLR_NONE)) return;
        }
        if (Type==OP_SELL)
        {
          if (L!=0 && OrderProfit()<=OrderLots()*L*(-1))   // или так Ask>=OOP+L*Point)
          if(OrderSend(Symbol(),OP_BUY,OrderLots(),Ask,7,0,0,"Reverse",0,0,CLR_NONE)) return;
        }
      }
    }
  }
}

ой

OrderProfit()>=OrderLots()*L*(-1)    больше либо равно

 
dmitri58_mql5:
ой

OrderProfit()>=OrderLots()*L*(-1)    больше либо равно


а ненене, в первый раз я правильно написал 

OrderProfit()<=OrderLots()*L*(-1)

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