Ваши вопросы по языку MQL4

hoz

Активный участник
Добрый день!
В индикаторе TDI Red Green обозначены 3 уровня:
SetLevelValue(0,50);
SetLevelValue(1,68);
SetLevelValue(2,32);
Как можно получить значения 50, 68 и 32 из этого индикатора?
Спасибо.

Находишь буферы в индикаторе и сравниваешь их значения с абсолютным требуемым значением (50, 68 и 32). Если равно значению, значит вывести его в журнал например (цену на нём или что нужно).
 

hoz

Активный участник
Появился вопрос к знатокам. Больше для прокачки своего понимания, ежели нужда..

Вот есть такой код:

PHP:
int start()
{ 

   int Array[4] = {1, 2, 3, 4};
   int x1, x2, x3, x4;
   int Array_Size = ArrayRange(Array, 0);


   for(x1=0; x1<Array_Size; x1++)
   {
      Print("Combination = ", Array[x1]);

      for(x2=x1+1; x2<Array_Size; x2++)
      {
         Print("Combination = ", Array[x1] + "   " + Array[x2]);

         for(x3=x2+1; x3<Array_Size; x3++)
         {
            Print("Combination = ", Array[x1] + "   " + Array[x2] + "   " + Array[x3]);

            for(x4=x3+1; x4<Array_Size; x4++)
            {
               Print("Combination = ", Array[x1] + "   " + Array[x2] + "   " + Array[x3] + "   " + Array[x4]);
            }
         }
      }
   }


   return(0);
}


Объясните, как будет происходить расчёт данной конструкции. От самого глубоко вложенного цикла к началу, или наоборот? И вообще, как это понять.. Попалась мне такая картина, смотрю.. и что-то не совсем догоняю.
 
Последнее редактирование модератором:

eevviill

Заблокирован
Появился вопрос к знатокам. Больше для прокачки своего понимания, ежели нужда..

Вот есть такой код:

PHP:
int start()
{ 

   int Array[4] = {1, 2, 3, 4};
   int x1, x2, x3, x4;
   int Array_Size = ArrayRange(Array, 0);


   for(x1=0; x1<Array_Size; x1++)
   {
      Print("Combination = ", Array[x1]);

      for(x2=x1+1; x2<Array_Size; x2++)
      {
         Print("Combination = ", Array[x1] + "   " + Array[x2]);

         for(x3=x2+1; x3<Array_Size; x3++)
         {
            Print("Combination = ", Array[x1] + "   " + Array[x2] + "   " + Array[x3]);

            for(x4=x3+1; x4<Array_Size; x4++)
            {
               Print("Combination = ", Array[x1] + "   " + Array[x2] + "   " + Array[x3] + "   " + Array[x4]);
            }
         }
      }
   }


   return(0);
}


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

jib07

Местный житель
Объясните, как будет происходить расчёт данной конструкции. От самого глубоко вложенного цикла к началу, или наоборот? И вообще, как это понять.. Попалась мне такая картина, смотрю.. и что-то не совсем догоняю.
В чем именно вопрос то, у х4 - 1 значение, х3 - 2 значения, х2 - 3 значения,
х1 - 4 значения.
Т.е. начинайте с конца и увидете, что х4 = (4), х3 = (3 или 4), х2 = (2 или 3 или 4), х1 = (1 или 2 или 3 или 4)
 

hoz

Активный участник
В чем именно вопрос то, у х4 - 1 значение, х3 - 2 значения, х2 - 3 значения,
х1 - 4 значения.
Т.е. начинайте с конца и увидете, что х4 = (4), х3 = (3 или 4), х2 = (2 или 3 или 4), х1 = (1 или 2 или 3 или 4)

Тут переменные то те, которые мы уже знаем. Оно и понятно. А если бы мы не знали, какие переменные где, т.е. когда массив заполняется по мере отработки кода, то ситуация то меняется.
Если выполняется по очереди, как указал eevviill, то всё вроде как просто. Хотя есть подозрение почему-то, что может быть и не так.
Где применяеются подобные вариации?
 

jib07

Местный житель
Тут переменные то те, которые мы уже знаем. Оно и понятно. А если бы мы не знали, какие переменные где, т.е. когда массив заполняется по мере отработки кода, то ситуация то меняется.
Если выполняется по очереди, как указал eevviill, то всё вроде как просто. Хотя есть подозрение почему-то, что может быть и не так.
Где применяеются подобные вариации?

Дак ну представте что в массиве числа и Вы их не знаете,но работает тот алгоритм, который я описал выше, а именно перебор в таком порядке))
Такого я нигде не встречал))
Просто Вы загоняетесь на пустом месте, счетчик работает в счетчике- типичная ситуация в основном для сравнения элементов 2х массивов и других операций)))
 
  • Like
Реакции: hoz

hoz

Активный участник
В чем именно вопрос то, у х4 - 1 значение, х3 - 2 значения, х2 - 3 значения,
х1 - 4 значения.
Т.е. начинайте с конца и увидете, что х4 = (4), х3 = (3 или 4), х2 = (2 или 3 или 4), х1 = (1 или 2 или 3 или 4)
Дело в том, что я не понял, почему по Вашему у данных переменных такие значения есть. Почему x4 - значение?, а, например, x2 - (2 или 3 или 4)? Вроде как тут нет канкретики. Ведь есть массив. У него 4 элемента. Значения переменных x1...x4 не определены заранее. А значит нужно смотреть на это как-то иначе. Вот что меня смущает.


Дак ну представте что в массиве числа и Вы их не знаете,но работает тот алгоритм, который я описал выше, а именно перебор в таком порядке))
Такого я нигде не встречал))
Просто Вы загоняетесь на пустом месте, счетчик работает в счетчике- типичная ситуация в основном для сравнения элементов 2х массивов и других операций)))

Да, возможно я и загнался.. Но всё потому, что ситуация столь неординарная. Я так вообще не в курсах, зачем такое вообще нужно.. Тем более в трейдинге :facepalm:
И как же сравниваются элементы обоих массивов?
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Я так вообще не в курсах, зачем такое вообще нужно.. Тем более в трейдинге :facepalm:
Для некоторых, это способ защиты от декомпила. Ничего не выполняющий, но запутывающий код. Начинает читать такой код не-до-программист, встречает такой цикл, у него крыша съезжает и он этот код выбрасывает не сумев разобраться.
Но к тебе это не относится. Ты настойчиво разбираешься. :D
В трейдинге я тоже не представляю таких случаев где нужен вложенный цикл. Но так можно пудрить мозги заказчику количеством строк кода и соответственно набивать цену.
 

Ugar

Гуру форума
В трейдинге я тоже не представляю таких случаев где нужен вложенный цикл.
А я не стесняюсь узать вложенные циклы. Только не для дури, а по делу. Например для заполнения значениями многомерного массива.
Код:
int arr [1000][100][10];
for(i=0;i<1000;i++)
 {
     for(i2=0;i2<100;i2++)
        {
        for(i3=0;i3<10;i3++)
            {
            arr [i][i2][i3]=...
            }
        }
   }
 

AlexeyVik

Программист mql4 mql5
А я не стесняюсь узать вложенные циклы. Только не для дури, а по делу. Например для заполнения значениями многомерного массива.
Код:
int arr [1000][100][10];
for(i=0;i<1000;i++)
 {
     for(i2=0;i2<100;i2++)
        {
        for(i3=0;i3<10;i3++)
            {
            arr [i][i2][i3]=...
            }
        }
   }
Андрей, я нисколько не сомневался в твоих способностях. Да и сам я знаю как это работает, а вот в советнике многомерные массивы использовать как-то ни к чему. Ну есть у меня один индикатор информер с 2х мерным массивом. А больше как-то и нет нужды.
Ты-бы лучше привёл пример конкретного кода из советника, где такой подход мог-бы сэкономить машинное время или упростил-бы код...
 

Ugar

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

Ugar

Гуру форума
Кстати. Я пожалуй то же задам вопрос. Может на него уже кто то давно знает ответ.
Как добыть время с точностью до микросекунд?
Было бы очень полезно для выявления сколько какая функция или операция выполняется.
 

hoz

Активный участник
Кстати. Я пожалуй то же задам вопрос. Может на него уже кто то давно знает ответ.
Как добыть время с точностью до микросекунд?
Было бы очень полезно для выявления сколько какая функция или операция выполняется.

Я как-то задавал вопрос подобный на мкл4. Там много вариантов было предложено. Некоторые я не понял вообще. Могу дать ссылку.. И можно через мой профиль там зайти.. Ветку начинал я, так что не составит труда найти, и, возможно, будет полезно!
 

hoz

Активный участник
У меня тут ошибка при выставлении отложенника. Вот появляется иногда.. За неделю прогона в тестере, тока один момент такой попался.
Вот функция:

PHP:
//+-------------------------------------------------------------------------------------+
//| Открытие отложенной короткой позиции                                                |
//+-------------------------------------------------------------------------------------+
bool OpenPendingSell(double lot, double price)
{
   int g_ticket = -1;
   double OOP = price - i_distanceFromLastPos * pt;
      
   if (OOP < Bid)
   {
       fCheck_ValidPendingOOP(Symbol(), OP_SELLSTOP, OOP);
       
       g_ticket = OrderSend(Symbol(), OP_SELLSTOP, lot, ND(OOP), 30, 0, 0, NULL, i_magic, 0, CLR_NONE);
   }
   if (g_ticket > 0)
   {
       return (true);
   }
   else
       Print ("OpenPendingSell(): Ордер послать не удалось " + GetLastError());
   
   return (false);
}


Вот что в журнале:

PHP:
2013.09.10 14:24:34	2013.08.15 13:04  Perevorot EURUSD.GI,M5: OpenPendingSell(): Ордер послать не удалось 0

Как выяснить причину? Распечатывать всё что только в данной функции используется прямо перед Ордерсендом? Ошибка то вообще не говорящая толком ни о чём...
 
Последнее редактирование модератором:

Ugar

Гуру форума
Я как-то задавал вопрос подобный на мкл4. Там много вариантов было предложено. Некоторые я не понял вообще. Могу дать ссылку.. И можно через мой профиль там зайти.. Ветку начинал я, так что не составит труда найти, и, возможно, будет полезно!
Кинь ссылку в личку. А зачем через твой профиль заходить, ветка в привате чёль?
 

hoz

Активный участник
Кинь ссылку в личку. А зачем через твой профиль заходить, ветка в привате чёль?

Не приват. Просто через профиль можно просто найти темы, которые начал тот, чей профиль смотришь. Я к этому веду....
 
  • Like
Реакции: Ugar

AlexeyVik

Программист mql4 mql5
Кстати. Я пожалуй то же задам вопрос. Может на него уже кто то давно знает ответ.
Как добыть время с точностью до микросекунд?
Было бы очень полезно для выявления сколько какая функция или операция выполняется.
А GetTickCount() не подходит? Или тебе мельче надо?
 

Ugar

Гуру форума
А GetTickCount() не подходит? Или тебе мельче надо?
Там миллисекунды, а я хотел микросекунды. Многие функции и операторы выполняются быстрее миллисекунды, так что это грубовато.
Наверняка в коме есть системный таймер с дискретой в микросекунду. Вот и спрашиваю как до него добраться. Может какие то dll в винде есть для этого?
 

hoz

Активный участник
Я вот призадумался. Ведь многие функции, которые используются один раз за определённый момент времени(иногда довольно длинный), чтобы код эксперта работал быстрее, нужно в плане оптимизации вызывать как можно меньше. Но это и так понятно. Я хотел сказать, что, буквально вчера думал над некоторыми вариантами. Начал с функции модификации ордеров(первоначальной установки тейки и стопа). Для краткости назовём её ФМО, что бы ниже по контексту не писать больше, чем можно.
Я вижу 2 варианте реализации (если кто-нибудь может добавить.. буду очень рад!):

1. ФМО можно вызывать сразу из функции посыла ордера, неважно рыночного или отложенного, при условии, что ордер послан успешно и выбран его тикет:
PHP:
if (ticket > 0)
{  
                if (SL != 0.0 || TP != 0.0)
                {
                    double ld_SL = 0.0, ld_TP = 0.0;
                    if (OrderSelect (li_Ticket, SELECT_BY_TICKET))
                    {
                        fOrderModify (ticket, OrderOpenPrice(), SL, TP, 0, 0);
                    }
                }
            }
Но при торговле на реале ордер может не модифицироваться, и, значится, нужно в старте снова вызывать функцию ФМО, чтобы установить стопы и теки ордерам, у которых ещё они не установлены.
2. Как-вариант, можно вообще в функции посылающей ордера не ставить ничего, а всё вызывать из старта.
В любом случает, приходится вызывать ФМО из старта постоянно, и, на каждом тике, а не, например, раз за бар или какое-то время. А удобно было как-то оптимизировать код, чтобы не вызывать ФМО из старта постоянно. Т.к. это экономия ресурсов, и выполнение лишних операции.

Есть какие-нибудь варианты решения данной ситуации?
 
Верх