Советники: Free Candle

 

Free Candle:

Эксперт по стратегии "Свободная свеча".

Описание стратегии можно легко найти в интернете. Если вкратце, то на графике М15 наносим ЕМА 9 и, когда появляется свеча, которая не касается ЕМА ни телом, ни тенями, открываем сделку в ее сторону. Стоп Лосс устанавливаем за свечу, тейкпрофит до 2-х Стоп Лоссов. При достижении определенного профита, переводим в безубыток. Рекомендованы к работе все основные валютные пары EURUSD, USDJPY, USDCHF, GBPUSD и основные кроссы EURGBP, EURJPY,GBPJPY.


Настраиваемые параметры

sinput double Risk    = 1;             //  Риск на одну сделку, %
sinput double MinLot  = 0.01;          //  Минимальный лот
extern int    CtoB    = 80;            //  Минимальное соотношение свечи к ее телу, %
extern int    CandMin = 50;            //  Не открываем ордер, если свеча меньше, пипсы
extern int    CandMax = 800;           //  Не открываем ордер, если свеча больше, пипсы
extern int    SprMax  = 30;            //  Не открываем ордер, если спред больше, пипсы
extern int    TakePr  = 150;           //  Тейк Профит, % от Стоп Лосса
extern int    BE      = 85;            //  Перевод в безубыток, % от Стоп Лосса
extern uchar  TimeIn  = 10;            //  Время начала работы робота, ЧЧ
extern uchar  TimeOut = 18;            //  Время окончания работы робота, ЧЧ
sinput bool   Mail    = true;          //  Отправка почты

Автор: Oleksii Chepurnyi

 

Он сделок не открывает. Никогда.

 
papkovin:

Он сделок не открывает. Никогда.

А можно поподробней: инструмент, ТФ, параметры счета и советника?
 
if(TimeHour(TimeCurrent()<TimeIn || TimeHour(TimeCurrent()>=TimeOut) return;  
 Так лучше ?
 
Aliaksei Karalkou:
 Так лучше ?

Я так подозреваю, что вот так (скобок не хватает):

if(TimeHour(TimeCurrent())<TimeIn || TimeHour(TimeCurrent())>=TimeOut) return;
Чем лучше?
 

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

Соорудил такую конструкцию и пару часов потестил на минутке:

   Print("Ч ",Hour());
   Print("Ч ",TimeHour(TimeCurrent()));
   Print("М ",Minute());
   Print("М ",TimeMinute(TimeCurrent()));
   Print("С ",Seconds());
   Print("С ",TimeSeconds(TimeCurrent()));

В логе можно заметить, что значения одинаковы.

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

Файлы:
20170601.log  28 kb
 

Стратегию пока не тестировал и, по сути, ничего от нее не ожидаю, но хотелось бы отметить добрым словом стиль написания программы - просто и понятно, без излишних нагромождений. Поскольку Mql только недавно начал изучать, то нашел некоторые полезные мелочи в коде программы. 

 
AlexGoodCat:

Стратегию пока не тестировал и, по сути, ничего от нее не ожидаю, но хотелось бы отметить добрым словом стиль написания программы - просто и понятно, без излишних нагромождений. Поскольку Mql только недавно начал изучать, то нашел некоторые полезные мелочи в коде программы. 

Спасибо!

А какие мелочи, например?

Просто это одна из первых программ, много пересмотрено :)

 

1) Отдельно вынесенный громоздкий блок обработки ошибок;

2) Четко выделенный блок "ничегонеделания" в onTick: во многих программах его пихают в блок принятия решения (в  if-и на покупку/продажу);

3) Простой модификатор заказа (перенесения в БУ) - опять же, часто это простое действие расписывают на 100500 строк, не понятно зачем;

4) Отсутствуют структуры из множества вложенных if-ов.

5) Блок принятия решений (выставления ордеров) вынесен из onTick в отдельные функции.

В общем, ничего особенного, но эстетично, с намеком на ООПшность - хороший базовый скелет программы.

Как-то так:)

 
Alexander Zhogolko:

1) Отдельно вынесенный громоздкий блок обработки ошибок;

2) Четко выделенный блок "ничегонеделания" в onTick: во многих программах его пихают в блок принятия решения (в  if-и на покупку/продажу);

3) Простой модификатор заказа (перенесения в БУ) - опять же, часто это простое действие расписывают на 100500 строк, не понятно зачем;

4) Отсутствуют структуры из множества вложенных if-ов.

5) Блок принятия решений (выставления ордеров) вынесен из onTick в отдельные функции.

В общем, ничего особенного, но эстетично, с намеком на ООПшность - хороший базовый скелет программы.

Как-то так:)

1) О, он сейчас намного больше :) + добавлен блок, который пытается исправлять некритичные ошибки.

4) Без этого бывает не обойтись...

А в остальном да, код должен быть понятным, и прежде всего себе :) В OnTick (OnTimer и тп) структура программы, все остальное по блокам.

И побольше комментариев :) После написания первой относительно большой программы вернулся к ней через месяц-два, что-то добавить, и сижу вспоминаю, что тут к чему, хотя тогда думал "что тут комментировать, и так понятно". Убил день, чтобы все вспомнить и прокомментировать, зато теперь быстро все нахожу и вношу изменения :)