Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1143

 
Alexey Viktorov:

Один из них я. И С# или С++ никогда не изучал, и никогда не знал что такое ООП.

Поймите простую истину, что mql5 отличается от mql5 только функцией OrderSend() и может ещё несколько функций которые я не помню. Ещё важное отличие, это направление индексации индикаторных буферов. Но это решается в полтычка, хотя лучше привыкнуть к новшеству. А получение значений индикаторов осталось прежним. Я не читал учебник Ковалёва, не знаю что там есть, но очень сомневаюсь, что какое-то решение из этого учебника невозможно было-бы написать пользуясь обновлённым MetaEditor`ом mql4.

Круто.)))) У меня не получилось, правда в нагрузке процедурные фортран и бейсик. Хороший учебник, хорошо структурирован, достаточно понятен и реально может быть взят за основу, если создателям нужны ученики конечно. Других таких к сожалению нет. ООП не хватает, приходится читать статьи.  Достаточно много из учебника пробывал на обновленном терминале МТ4. Замечаний по не приведенным типам данных много. Ошибок компилятор не увидел даже в строгой проверке.

 
Valeriy Yastremskiy:

Круто.)))) У меня не получилось, правда в нагрузке процедурные фортран и бейсик. Хороший учебник, хорошо структурирован, достаточно понятен и реально может быть взят за основу, если создателям нужны ученики конечно. Других таких к сожалению нет. ООП не хватает, приходится читать статьи.  Достаточно много из учебника пробывал на обновленном терминале МТ4. Замечаний по не приведенным типам данных много. Ошибок компилятор не увидел даже в строгой проверке.

Вот здесь мои соображения по поводу ООП. И не вредно будет почитать всю тему с начала.

ООП для школьников.
ООП для школьников.
  • 2019.10.04
  • www.mql5.com
======================================================================================================================== В этой теме будет нескольк...
 

Приветствую. Подскажите, пожалста.  После выбора ордера непонятно по какой причине меняется тикет. Код:

      for(int i=OrdersTotal()-1; i>=0; i--){
         if(OrderSelect(i ,SELECT_BY_POS, MODE_TRADES)){
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_BUYSTOP){
               Print("111  OrderTicket() ", OrderTicket(), "  OrderType() ", StringType(OrderType()));
               temp=OrderTicket();
               if( OrderOpenPrice()>start_bid
               +((MathCeil( (Bid-start_bid)/(bs_distance*Point) )+bs_orders+Orders("bs")+1)*bs_distance*Point) ){
                  Print("222 OrderDelete bs Bid ", Bid, "  OrderOpenPrice() ", OrderOpenPrice()); 
                  if(!OrderDelete(OrderTicket(), clrBlack)){
                     Print("333 OrderDelete bs Bid ", Bid, "  OrderTicket() ", OrderTicket(), "  OrderType() ", StringType(OrderType()));
                  }
               }
            }
         } 
      }

В рынке два ордера, BUYSTOP тикет 10 и BUY тикет 9 .

Журнал:


 
Alexey Viktorov:

Вот здесь мои соображения по поводу ООП. И не вредно будет почитать всю тему с начала.

Спасибо, согласен))))

 
Andrey Sokolov:

Приветствую. Подскажите, пожалста.  После выбора ордера непонятно по какой причине меняется тикет. Код:

В рынке два ордера, BUYSTOP тикет 10 и BUY тикет 9 .

Журнал:


предполагаю, что в одной из самописных функций идёт перебор по ордерам (например, Orders("bs")), и, соответственно, повторное OrderSelect(). на момент возвращения в представленный цикл, все данные выдаются для последнего выбранного там ордера.

 
Igor Zakharov:

предполагаю, что в одной из самописных функций идёт перебор по ордерам (например, Orders("bs")), и, соответственно, повторное OrderSelect(). на момент возвращения в представленный цикл, все данные выдаются для последнего выбранного там ордера.

спасиб

 
Andrey Sokolov:

Приветствую. Подскажите, пожалста.  После выбора ордера непонятно по какой причине меняется тикет. Код:

В рынке два ордера, BUYSTOP тикет 10 и BUY тикет 9 .

Журнал:


Ваш рабочий код не соответствует выложенному коду.

Print("222 OrderDelete bs Bid ", Bid, "  OrderOpenPrice() ", OrderOpenPrice());

Где в этом коде на принт выводится "OrderTicket()"

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

 
Alexey Viktorov:

Вы попали по самому правильному адресу. Здесь подсказывают как сделать на mql4 правильно, руководствуясь новой документацией по mql4.

Если вы затрудняетесь в написании чего-то, то задайте конкретный вопрос, что вы написали и что не смогли получить. Только учитывайте, что километровый код с одной непонятной строкой мало кто будет читать. Я точно не буду.

Вы именно тот человек для которого и предназначался мой вопрос. Потому что исходя из именного Вашего требования я сделал свой код Mql4 для тестера  коротким только для того что наглядно продемонстрировать свою проблему. Но к сожалению это не нашло понимание у Артема.

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

Мне нужно после закрытия по стопу каждого ордера( а их одновременно открытых много) выводить в Print () некоторые параметры закрытого ордера. Я научился это делать очень успешно. Но.....есть одна проблема на решение которой моего ума не хватает. Некоторые ордера закрываются по стопу на одном тике и по одной цене. И тогда программа игнорирует первый закрывшийся ордер и печатает Print() только последнего закрытого ордера. А после первого не печатает.

ВОПРОС

При помощи какой языковой конструкции можно сделать что бы программа , в случаях которые я выше описал печатала Print ()  и после первого закрытого по стопу ордера?

int H;
int L;
int TP;  
int start()
{
int Ht = OrdersHistoryTotal();
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                             
if (TP!=OrderTicket( ))
{
Print("---------------------------------------------------------------=",TimeToString(OrderOpenTime()) );
TP=OrderTicket( );
}

if (TimeCurrent()==1262598040)
if (H==0)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,1.6217,1.60919,"300",10 );
H=1;
}
if (TimeCurrent()==1262601140)
if (L==0)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,1.62199,1.61758,"300",10 );
L=1;
}
return(0);


 
ANDREY:

Вы именно тот человек для которого и предназначался мой вопрос. Потому что исходя из именного Вашего требования я сделал свой код Mql4 для тестера  коротким только для того что наглядно продемонстрировать свою проблему. Но к сожалению это не нашло понимание у Артема.

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

Мне нужно после закрытия по стопу каждого ордера( а их одновременно открытых много) выводить в Print () некоторые параметры закрытого ордера. Я научился это делать очень успешно. Но.....есть одна проблема на решение которой моего ума не хватает. Некоторые ордера закрываются по стопу на одном тике и по одной цене. И тогда программа игнорирует первый закрывшийся ордер и печатает Print() только последнего закрытого ордера. А после первого не печатает.

ВОПРОС

При помощи какой языковой конструкции можно сделать что бы программа , в случаях которые я выше описал печатала Print ()  и после первого закрытого по стопу ордера?


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

 
ANDREY:

Вы именно тот человек для которого и предназначался мой вопрос. Потому что исходя из именного Вашего требования я сделал свой код Mql4 для тестера  коротким только для того что наглядно продемонстрировать свою проблему. Но к сожалению это не нашло понимание у Артема.

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

Мне нужно после закрытия по стопу каждого ордера( а их одновременно открытых много) выводить в Print () некоторые параметры закрытого ордера. Я научился это делать очень успешно. Но.....есть одна проблема на решение которой моего ума не хватает. Некоторые ордера закрываются по стопу на одном тике и по одной цене. И тогда программа игнорирует первый закрывшийся ордер и печатает Print() только последнего закрытого ордера. А после первого не печатает.

ВОПРОС

При помощи какой языковой конструкции можно сделать что бы программа , в случаях которые я выше описал печатала Print ()  и после первого закрытого по стопу ордера?

Я не помню ответ Артёма, да и искать не буду, я и так догадаюсь что он мог ответить. Именно в его статьях есть весь нужный функционал для этого и все коды в его статьях либо мультитерминальные либо их две версии, для mql5 и для mql4. Я проверял эти варианты на mql4, всё отрабатывает «на ура» отлавливает закрытие по стопу или тейку и не ошибается.

Да, разобраться в этих статьях сложно, но оно того сто́ит, если вам не больше лет чем мне. А мне, для программиста неприлично много.

Другой вариант попроще, но работать будет гораздо медленнее. Пишите тикеты ордеров в массив, и по этому массиву выбирайте ордер, сверяйте время закрытия ордера. Если больше нуля, значит закрыт. Если в комментарии этого закрытого ордера есть буквы «sl» значит ордер закрыт по стопу. Дальше, если ордер закрыт из массива удаляем. Или после завершения прохода по всему массиву, его перезаполняем оставшимися открытыми ордерами. В общем полёт фантазии...

Какой вариант выбрать решение за вами. И прочтите несколько моих сообщений по поводу учебника Ковалёва. Именно в учебнике предлагается писать int start() тогда как в обновлённом mql4 для советников надо писать void OnTick()

Для индикаторов и скриптов смотрите в документации. И к стати, индикаторы писать в обновлённом mql4 гораздо легче, чем это было в то время когда Сергей писал этот учебник.

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