Как выбрать ордер по тикету? - страница 4

 
Artyom Trishkin:

Разве ж я против? Хочу донести до человека, что в первую очередь важна логика. Сначала нужно определить конечную цель, далее разбить её на подцели и распределить по блокам. В программе, работающей с деньгами, главной целью должна быть надёжность. А значит в первую очередь нужно сделать так, чтобы у нас под рукой всегда находились актуальные данные рыночного окружения. Значит первоочередной задачей должна быть задача поиска нужных данных. Не хранения, а поиска. В этом случае программа будет не зависима от сбоев ОС, терминала, изменений в сортировке на сервере или в терминале и пр.

Если человеку нужно работать с последними тремя ордерами, то их нужно найти - не взять из памяти, а найти. Это первый блок данной задачи. А искать их нужно по времени открытия/закрытия. Далее уже можно сложить данные по этим ордерам во временный массив и, если размер массива не нулевой, то работать с ним - брать из него нужные данные по найденным ордерам.

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

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

Лично я вижу основную проблему так (без детализации) "выставить три ордера и спустя некоторое время к ним обратиться". Не уверен, что это обязательно три последних ордера. Но рассуждать об этом бесполезно, лучше пусть сам автор пояснит.


Dima DD:
Способов прописания одного и тогоже думаю не один, и не два, с магиком всё работает. Код достаточно большой, чтобы половину удалить и показать.Главное сделал то,что нужно было. Всем спасибо.
Написал текст выше, не видя Ваше сообщение. Расскажите в двух словах задачу, чтобы мы тут не гадали :)
 
Dima DD:
Способов прописания одного и тогоже думаю не один, и не два, с магиком всё работает. Код достаточно большой, чтобы половину удалить и показать.Главное сделал то,что нужно было. Всем спасибо.
Когда сломается - приходите ;)
 
Sergey Eremin:

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

Лично я вижу основную проблему так (без детализации) "выставить три ордера и спустя некоторое время к ним обратиться". Не уверен, что это обязательно три последних ордера. Но рассуждать об этом бесполезно, лучше пусть сам автор пояснит.


Написал текст выше, не видя Ваше сообщение. Расскажите в двух словах задачу, чтобы мы тут не гадали :)
Категоричность в том, что костыли человек делает для решения своей задачи, идёт по неверному пути изначально. Потому и сказал - огород.
 
Artyom Trishkin:

Разве ж я против? Хочу донести до человека, что в первую очередь важна логика. Сначала нужно определить конечную цель, далее разбить её на подцели и распределить по блокам. В программе, работающей с деньгами, главной целью должна быть надёжность. А значит в первую очередь нужно сделать так, чтобы у нас под рукой всегда находились актуальные данные рыночного окружения. Значит первоочередной задачей должна быть задача поиска нужных данных. Не хранения, а поиска. В этом случае программа будет не зависима от сбоев ОС, терминала, изменений в сортировке на сервере или в терминале и пр.

Если человеку нужно работать с последними тремя ордерами, то их нужно найти - не взять из памяти, а найти. Это первый блок данной задачи. А искать их нужно по времени открытия/закрытия. Далее уже можно сложить данные по этим ордерам во временный массив и, если размер массива не нулевой, то работать с ним - брать из него нужные данные по найденным ордерам.

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

Не нужно усложнять, пусть для начала опишет логику. А то в описании одно, а в коде другое. Точнее какая та пурга, с рекурсией
 
Alexey Busygin:
Не нужно усложнять, пусть для начала опишет логику. А то в описании одно, а в коде другое. Точнее какая та пурга, с рекурсией

Да чего там описывать?? Вся проблема в том, что при открытии ордера переменной ticket2, объявленной видимо локальной, присваивается тикет, а при вызове функции comment2() эта переменная объявляется заново и соответственно инициализируется нулём. После чего идёт попытка выбрать ордер по тикету 0. А где-же его взять если такого быть не может.

Этот код скопирован из первого поста.

double comment2()
{ 
  datetime time=0;
  int ticket2;//тикет назначенный второму ордеру
 for(int i=1; i<=OrdersTotal(); i++)
    {
  if(OrderSelect(ticket2, SELECT_BY_TICKET))  
    {   
  if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
         { 
           ticket2 = OrderTicket();         
           double comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера
         }  
     }
    }
  return(comment2); 
}

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

 
Alexey Viktorov:

Да чего там описывать?? Вся проблема в том, что при открытии ордера переменной ticket2, объявленной видимо локальной, присваивается тикет, а при вызове функции comment2() эта переменная объявляется заново и соответственно инициализируется нулём. После чего идёт попытка выбрать ордер по тикету 0. А где-же его взять если такого быть не может.

Этот код скопирован из первого поста.

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

Я тоже не пробовал, но это называется рекурсия, вызов функции, внутри функции. То что он с ней сделал, это ошибка, так как функция не может быть, переменной и функцией одновременно.

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

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

  if(OrderSelect(ticket2, SELECT_BY_TICKET))//Здесь тикет2 нужно заменить на индекс пересчета "i" индекс счета  и изменить на SELECT_BY_POS чтобы пересчет шел по номеру

Дальше фильтр, для сравнения с тикетом. Переименование переменной comment2 в другую переменную хотя бы comment

double comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера
И вывод этой переменной на return (comment); Ну и изменить тип данных функции на int так как она работает с целым типом. А выводит действительный.
 
Alexey Busygin:

Я тоже не пробовал, но это называется рекурсия, вызов функции, внутри функции. То что он с ней сделал, это ошибка, так как функция не может быть, переменной и функцией одновременно.

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

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

Дальше фильтр, для сравнения с тикетом. Переименование переменной comment2 в другую переменную хотя бы comment

И вывод этой переменной на return (comment); Ну и изменить тип данных функции на int так как она работает с целым типом. А выводит действительный.

Алексей, ты невнимательно прочёл заголовок темы. "Как выбрать ордер по тикету?" Соответственно основная ошибка в том, что переменная инициализируется нулём внутри функции, хотя вся функция - одна большая ошибка.

Но как я понял вопрос как-то решён и дальнейшее его обсуждение бессмыслено.

 
Alexey Viktorov:

Алексей, ты невнимательно прочёл заголовок темы. "Как выбрать ордер по тикету?" Соответственно основная ошибка в том, что переменная инициализируется нулём внутри функции, хотя вся функция - одна большая ошибка.

Но как я понял вопрос как-то решён и дальнейшее его обсуждение бессмыслено.

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

В одном старом учебнике по МТ4 был пример функции выбора ордера.

#include <tpVariables.mqh>
//+------------------------------------------------------------------------+
int Terminal()
  {
  int i,Num;
  ArrayCopy(Mas_Ord,Mas_New);                       //Перезапись массивов  |
  Num=0;
  ArrayInitialize(Mas_Price,0);//Ночальная установка и обнуление массивов  |
  ArrayInitialize(Mas_New,0);  //Ночальная установка и обнуление массивов  |
  ArrayInitialize(Mas_Tip,0);  //Ночальная установка и обнуление массивов  |
//----
  for(i=0; i<OrdersTotal(); i++)                //Счетчик по всем ордерам  |
     {
     if((OrderSelect(i,SELECT_BY_POS)==true)&&(OrderSymbol()==Symbol()))
       {
       Num++;                                           //Счетчик ордеров  |
       Mas_New[Num][1]=OrderTicket();                      //Номер ордера  |
       Mas_Price[Num] =OrderOpenPrice();                    //Массив цены  |
       Mas_New[Num][2]=OrderOpenPrice();           //Цена открытия ордера  |
       Mas_Tip[OrderType()]++;               //Количество ордеров по типу  |
       Mas_New[Num][3]=OrderType();                          //Тип ордера  |
       Mas_New[Num][4]=OrderLots();                    //Количество лотов  |
       Mas_New[Num][5]=OrderProfit();                    //Пробыль ордера  |
       Mas_New[Num][6]=OrderSwap();           //Своп для выбраного ордера  |
       Mas_New[Num][7]=OrderMagicNumber();                        //Номер  |
       if(OrderComment()=="")
       Mas_New[Num][8]=0;
       else
       Mas_New[Num][8]=1;
       }
     }
  Mas_New[0][0]=Num;                                 //Количество ордеров  |
  return;
  }
Я малость её реформировал, под собственные нужды, но как пример вполне пригодна.
 
Огород зарос капустой...
 
Alexey Busygin:

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

Я уже отвечал в этой ветке на подобные претензии

Alexey Viktorov:

Может я и не прав, но придерживаюсь мнения, что "Вежливость придумали для того, чтобы скрыть недостаток добра в отношениях между людьми." Так-что даже на "ты" я вёл эту беседу с полным уважением мнения собеседника.

Alexey Busygin:

В одном старом учебнике по МТ4 был пример функции выбора ордера.

Я малость её реформировал, под собственные нужды, но как пример вполне пригодна.

Учебники пишут не для того чтобы научить кого-то, а для того чтобы написать и получить за это чуток денег...

Такое можно написать только для учебника.

Artyom Trishkin:
Огород зарос капустой...
Зарос огород не капустой, а полынью... Пойдём отсюда...