Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 100

 
alexey1979621:
Привет всем! Вопрос такой. Как измерить расстояние между High и Low первой, второй, третьей свечой и прописать условие, что такое расстояние каждой свечи должно быть не менее, скажем, 10 пунктов. Заранее благодарен.

Вот Вам переменные рыночного окружения в помощь https://docs.mql4.com/ru/predefined/variables
 
artmedia70:
Восстание роботов... :)


Аха ха ха. yosuf, Киборг Вас послал... )))))))
 
artmedia70:

Вот советник для тестирования функции. В нём, собственно, сама функция и её вызов. Перед вызовом нужно подготовить сообщение, которое может состоять максимум из четырёх строк. Длина каждой строки, если мне память не изменяет, не должна превышать 64 символа. Именно потому я и сделал разбиение одного сообщения на несколько строк. Каждую строку одного сообщения можно выводить своим цветом. Там в коде вроде как всё понятно - сначала подготавливаем строки сообщений, затем вызываем функцию. Особо там не комментировал - писал на одном дыхании, давно. Теперь уже подзабыл что там для чего. Если будут вопросы - вспомню, сейчас вспомнил только самое необходимое.

Ну и индюшок:

Вот как-то так... Надеюсь разберётесь

Можно конечно вместо вывода в окно индюка сделать подложку и выводить на основной график, но мне лень... :)



Артём, код я Ваш посмотрел, индюк вообще бомба:)))). По сути, с большего всё понятно, хотя пару моментов в реализации я увидел, чутка не такими, как сделал бы я, но это уже мелочи.

Вот что интересно. Печатаются только то, что есть в эксперте в индюк. Но как его применить с пользой для себя есть варианты?

 
hoz:


Артём, код я Ваш посмотрел, индюк вообще бомба:)))). По сути, с большего всё понятно, хотя пару моментов в реализации я увидел, чутка не такими, как сделал бы я, но это уже мелочи.

Вот что интересно. Печатаются только то, что есть в эксперте в индюк. Но как его применить с пользой для себя есть варианты?

Чё-то я не понял вопроса... Он заменяет функцию Print(). Выводит все сообщения в окно индюкатора. Можно задавать цвет для каждой строки одного сообщения (ну, типа - приоритет важности сообщения). Удобнее принта. Вот и вся польза.
 

Это же функция. Эксперт тот только для показа того, что делает функция. Вот и используйте эту функцию для вывода своих сообщений из своего эксперта.

В том эксперте показан только принцип её использования.

 
artmedia70:

Это же функция. Эксперт тот только для показа того, что делает функция. Вот и используйте эту функцию для вывода своих сообщений из своего эксперта.

В том эксперте показан только принцип её использования.


Хотя да.. Это же функция.. Пока въезжал, что там к чему самое главное упустил :(
 

Появился новый головняк. Вот что нужно, чтоб реализовалось:

1. Собирается какое-то количество ордеров в рынке т.е. в рынке присуствуют рыночные и отложенные ордера постоянно

2. В какой-то момент, когда последний из открытых до настоящего времени ордеров закрыт по ТП, нам нужно закрыть все ордера, которые открыть и снести отложки, в том числе.

Я это сделал так (в функции start() поместил):

for (int ord=OrdersTotal()-1; ord>=0; ord--)
   {
      if (!OrderSelect(ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();
              
      // Блок модификации ордеров       
      if (i_sl != 0 || i_tp != 0)
      {
         if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
         {
            OrdersModifyer(g_ticket);
         }
      }
      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)              
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

Функция GetLastOrderState() узнаёт закрыт ли последний ордер:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
            lastOrderOpenTime = -1;                    // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
          lastOrderOpenTime = OrderOpenTime();
   }
   Comment("Время открытия последнего открытого ордера = ", lastOrderOpenTime);
   for (int h=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(h, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      
      if (OrderOpenPrice() == lastOrderOpenTime)
          lastOrderCloseTime = OrderCloseTime();
   }
  // Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

Ну а дальше уже функции удаления отложенных и закрытия рыночных ордеров. Вижу, что работает как-то не правильно. Функция в порядке моя?

Я то понимаю, что функция в порядке по идее. Но с логикой тут не лады. Есть какие-нибудь соображения по этому поводу? Получается, что по-любому, даже когда ни какой из ордеров советника не закрылся по ТП, мимолётно после открытия по сигналу, всё мигом закрывается...

 
hoz:

Аха ха ха. yosuf, Киборг Вас послал... )))))))
Все равно, хороший, отзывчивый прогер. Как будто, все проблемы - его, за это судьба воздаст, бесспорно, или, наталкнется на грааль.
 
yosuf:
Все равно, хороший, отзывчивый прогер. Как будто, все проблемы - его, за это судьба воздаст, бесспорно, или, наталкнется на грааль.


А никакой канкретики не было, и, соответственно вопроса тоже. На что там отвечать ума не приложу.... Чтоб Вам ответили нужно постараться максимально прояснить ситуацию.
 
hoz:

Появился новый головняк. Вот что нужно, чтоб реализовалось:

1. Собирается какое-то количество ордеров в рынке т.е. в рынке присуствуют рыночные и отложенные ордера постоянно

2. В какой-то момент, когда последний из открытых до настоящего времени ордеров закрыт по ТП, нам нужно закрыть все ордера, которые открыть и снести отложки, в том числе.

Я это сделал так (в функции start() поместил):

Функция GetLastOrderState() узнаёт закрыт ли последний ордер:

Ну а дальше уже функции удаления отложенных и закрытия рыночных ордеров. Вижу, что работает как-то не правильно. Функция в порядке моя?

Я то понимаю, что функция в порядке по идее. Но с логикой тут не лады. Есть какие-нибудь соображения по этому поводу? Получается, что по-любому, даже когда ни какой из ордеров советника не закрылся по ТП, мимолётно после открытия по сигналу, всё мигом закрывается...

Виктор, возьми опробированную функцию Кима, проверяющую, что позиция закрыта по ТП:

isCloseLastPosByTake - Возвращает флаг закрытия последней позиции по тейку. Найдёшь в Только полезные функции
И потом закрывай всё.

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