Простой торговый робот - страница 4

 
sergey1294:
Возможно вам подойдет эта статья https://www.mql5.com/ru/articles/40

Т.е. для решения указанной проблемы без функции OnTrade() никак не обойтись? И в рамках OnTick() эту проблему не решить?

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

 
Yedelkin:

Т.е. для решения указанной проблемы без функции OnTrade() никак не обойтись? И в рамках OnTick() эту проблему не решить?

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

Автор не раскрыл все прелести этой функции. я сам толком ее не изучал. но суть ее такова, что она запускается когда с позицией что-то происходит. и по всей видимости проверку лучше делать в ней. и передавать необходимые значения потом в функцию OnTick().
 
sergey1294:
Автор не раскрыл все прелести этой функции. я сам толком ее не изучал. но суть ее такова, что она запускается когда с позицией что-то происходит. и по всей видимости проверку лучше делать в ней. и передавать необходимые значения потом в функцию OnTick().

Да, в общих-то чертах описание функции OnTrade() понятно. Непонятно пока, можно ли обойтись без неё при решении моего вопроса.

Решил использовать пока вот такой шаблон:

                     bool success=OrderSend(BigDogBuy,ResultBuy);   
                     if(success==true && (ResultBuy.retcode==10008 || ResultBuy.retcode==10009))
                       {
                        BigDogSell.action=TRADE_ACTION_PENDING;
                        BigDogSell.volume=...;
                        BigDogSell.price =...;
                        BigDogSell.sl    =...;
                        BigDogSell.type  =...;
                        OrderSend(BigDogSell,ResultSell);
                       }

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

Т.е. шаблон окажется из серии "перестраховался". Должно же быть какое-нибудь простое и грамотное решение!

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

 
Yedelkin:

Да, в общих-то чертах описание функции OnTrade() понятно. Непонятно пока, можно ли обойтись без неё при решении моего вопроса.



Как я понимаю нужно последовательно поставить два ордера, при этом второй должен выставляться только при 100% установке первого?


Может я и ошибаюсь, но как я понимаю вызов на установку первого ордера должен производиться из OnTimer() или OnTick(). После чего нужно анализировать результат OrderSend(BigDogSell,ResultSell) и действовать соответственно этому.


 
Interesting:


Как я понимаю нужно последовательно поставить два ордера, при этом второй должен выставляться только при 100% установке первого?


Может я и ошибаюсь, но как я понимаю вызов на установку первого ордера должен производиться из OnTimer() или OnTick(). После чего нужно анализировать результат OrderSend(BigDogSell,ResultSell) и действовать соответственно этому.


В справке есть такое примечание. так что наверно не важно где будет исполняться OrderSend, важно как будут обработаны результаты возврата сервера


Примечание

Следует иметь в виду при выставлении рыночного ордера, что успешное окончание работы метода OrderSend() не всегда означает успешное совершение сделки. 
Необходимо проверять в возвращаемой структуре результата result значение retcode, содержащее код возврата торгового сервера, 
а также значение полей deal или order в зависимости от типа операции.

 
sergey1294:

В справке есть такое примечание. так что наверно не важно где будет исполняться OrderSend, важно как будут обработаны результаты возврата сервера


Возможно я не совсем правильно выразился, но я имел введу анализ именно структуры.


Я почему-то считаю что предназначение OnTimer() или OnTick() таково:


OnTick() - Анализ рыночной информации по валюте рабочего графика, и совершении торговых операций по ней.

OnTimer() - Анализ рыночной информации по остальным валютам и совершение торговых операций по ним. Тут нужно также размещать все действия которые обрабатываются в определенное время, а также действия производимые в выходные.


OnTrade() - Нужен для анализа торговой информации. Но тут такая фишка - по большому счету тут нужно фиксировать факт появления, удаления нового отложника. И серьезно анализировать срабатывания отложника и выполнение рыночной операции (Buy или Sell).


PS

По идеи проще проанализировать результат установки первого отложника в или открытия позиции в OnTimer() или OnTick(), а затем ставить второй. Вот если бы скажем производилась открытие с рынка при уже существующей позе логичнее будет в OnTimer() или OnTick() зафиксировать сам факт успешности операции, а в OnTrade() уже узнать как это повлияло на открытую позу...


 
Interesting:

Возможно я не совсем правильно выразился, но я имел введу анализ именно структуры.


Я почему-то считаю что предназначение OnTimer() или OnTick() таково:


OnTick() - Анализ рыночной информации по валюте рабочего графика, и совершении торговых операций по ней.

OnTimer() - Анализ рыночной информации по остальным валютам и совершение торговых операций по ним. Тут нужно также размещать все действия которые обрабатываются в определенное время, а также действия производимые в выходные.



вы не правы по поводу этих функции

OnTick() - срабатывает при каждом тике

OnTimer() - срабатывает при заданном количестве секунд


 
sergey1294:

вы не правы по поводу этих функции

OnTick() - срабатывает при каждом тике

OnTimer() - срабатывает при заданном количестве секунд


А я что говорил что это нет так?


То что OnTimer() будет выполнятся с интервалов в 1 секунду не помешает там получать торговую информацию или реализовать суточный/недельный ролловер...

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