Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Как я собираю себе советника методом тыка Из этих...
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха, ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
//+------------------------------------------------------------------+//| TestDPO.mq5 |//| Copyright 2020, MetaQuotes Software Corp. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.00"//---#include <Trade\Trade.mqh>
CTrade trade;
//---inputint dpo_fast_period = 9; // DPO Fast Periodinputint dpo_slow_period = 40; // DPO Fast Periodinputint Inpmagic = 1000; // Magic советникаinputulong slippage = 10; // Проскальзывание ценыinputdouble Inpvolume = 0.01; // размер позицииinputbool Revers = false; // Revers//---double fDPOVal[]; // Динамический массив для хранения значений fast DPOdouble sDPOVal[]; // Динамический массив для хранения значений slow DPOint DPO_fast = 0; // Хэндл для быстрого DPOint DPO_slow = 0; // Хэндл для медленного DPO//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- prepare trade class to control positions if hedging mode is active
trade.SetExpertMagicNumber(Inpmagic);
trade.SetMarginMode();
trade.SetTypeFillingBySymbol(Symbol());
//--- DPO indicator
DPO_fast=iCustom(NULL,0,"Examples\\DPO",dpo_fast_period);
if(DPO_fast==INVALID_HANDLE)
{
printf("Error creating MA indicator");
return(INIT_FAILED);
}
//--- DPO indicator
DPO_slow=iCustom(NULL,0,"Examples\\DPO",dpo_slow_period);
if(DPO_slow==INVALID_HANDLE)
{
printf("Error creating MA indicator");
return(INIT_FAILED);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---//---------------Задаем цены покупки и продажи------------------------double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
int signal=0; // сигнал на покупку, продажу//*******************************************************************// эта часть программы выполняется каждый тик//-if(!isNewBar(PERIOD_M1))Print("Новый бар M1 ", TimeCurrent());
//-if(!isNewBar(PERIOD_M5))Print("Новый бар M5 ", TimeCurrent());
//-if(!isNewBar(PERIOD_CURRENT))Print("Новый бар M15", TimeCurrent());
//*******************************************************************//--------------Проверка на новый барif(!isNewBar(PERIOD_CURRENT))
return;
//--------------------------------------------------------------------ArraySetAsSeries(fDPOVal,true); // задаем направление индексов массиваArraySetAsSeries(sDPOVal,true);
if(CopyBuffer(DPO_fast,0,0,10,fDPOVal)<0) // наполняем массив значений DPO fast
{
Alert("Ошибка копирования буфера индикатора fast DPO. Ошибка ", GetLastError());
}
if(CopyBuffer(DPO_slow,0,0,10,sDPOVal)<0) // наполняем массив значений DPO slow
{
Alert("Ошибка копирования буфера индикатора slow DPO. Ошибка ", GetLastError());
}
double DPO_fast_c_value=NormalizeDouble(fDPOVal[1],6); // запоминаем значение индикатора DPO fast на предыдущем бареdouble DPO_slow_c_value=NormalizeDouble(sDPOVal[1],6); // запоминаем значение индикатора DPO slow на предыдущем бареdouble DPO_fast_p_value=NormalizeDouble(fDPOVal[2],6); // запоминаем значение индикатора DPO fast на пред-предыдущем бареdouble DPO_slow_p_value=NormalizeDouble(sDPOVal[2],6); // запоминаем значение индикатора DPO slow на пред-предыдущем бареif(DPO_slow_c_value>0 && DPO_slow_p_value<0 && DPO_fast_c_value>0) // если медленный индикатор пересекает 0 снизу вверх и быстрый находится выше 0
signal=1; // сигнал на открытие покупкиif(DPO_slow_c_value<0 && DPO_slow_p_value>0 && DPO_fast_c_value<0) // если медленный индикатор пересекает 0 сверху вниз и быстрый находится ниже 0
signal=-1; // сигнал на открытие продажиif(DPO_fast_c_value>0 && DPO_fast_p_value<0) // если быстрый индикатор пересекает 0 снизу вверх
signal=-2; // сигнал на закрытие продажиif(DPO_fast_c_value<0 && DPO_fast_p_value>0) // если быстрый индикатор пересекает 0 сверху вниз
signal=2; // сигнал на закрытие покупкиif(!Revers)
{
switch(signal)
{
case -1:
trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
break;
case1:
trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
break;
case -2:
trade.PositionClose(_Symbol,slippage);
break;
case2:
trade.PositionClose(_Symbol,slippage);
break;
}
}
if(Revers)
{
switch(signal)
{
case -1:
trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
break;
case1:
trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
break;
case -2:
trade.PositionClose(_Symbol,slippage);
break;
case2:
trade.PositionClose(_Symbol,slippage);
break;
}
}
}
/*
//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период |
//+------------------------------------------------------------------+
bool isNewBar()
{
//--- в статической переменной будем помнить время открытия последнего бара
static datetime last_time=0;
//--- текущее время
datetime lastbar_time=(int)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
//--- если это первый вызов функции
if(last_time==0)
{
//--- установим время и выйдем
last_time=lastbar_time;
return(false);
}
//--- если время отличается
if(last_time!=lastbar_time)
{
//--- запомним время и вернем true
last_time=lastbar_time;
return(true);
}
//--- дошли до этого места - значит бар не новый, вернем false
return(false);
}
*///+------------------------------------------------------------------+//| возвращает true если появился новый бар, иначе false |//+------------------------------------------------------------------+bool isNewBar(ENUM_TIMEFRAMES timeFrame)
{
//----staticdatetime old_Times[21];// массив для хранения старых значенийbool res=false; // переменная результата анализаint i=0; // номер ячейки массива old_Times[]datetime new_Time[1]; // время нового бараswitch(timeFrame)
{
casePERIOD_M1:
i= 0;
break;
casePERIOD_M2:
i= 1;
break;
casePERIOD_M3:
i= 2;
break;
casePERIOD_M4:
i= 3;
break;
casePERIOD_M5:
i= 4;
break;
casePERIOD_M6:
i= 5;
break;
casePERIOD_M10:
i= 6;
break;
casePERIOD_M12:
i= 7;
break;
casePERIOD_M15:
i= 8;
break;
casePERIOD_M20:
i= 9;
break;
casePERIOD_M30:
i=10;
break;
casePERIOD_H1:
i=11;
break;
casePERIOD_H2:
i=12;
break;
casePERIOD_H3:
i=13;
break;
casePERIOD_H4:
i=14;
break;
casePERIOD_H6:
i=15;
break;
casePERIOD_H8:
i=16;
break;
casePERIOD_H12:
i=17;
break;
casePERIOD_D1:
i=18;
break;
casePERIOD_W1:
i=19;
break;
casePERIOD_MN1:
i=20;
break;
}
// скопируем время последнего бара в ячейку new_Time[0]int copied=CopyTime(_Symbol,timeFrame,0,1,new_Time);
if(copied>0) // все ок. данные скопированы
{
if(old_Times[i]!=new_Time[0]) // если старое время бара не равно новому
{
if(old_Times[i]!=0)
res=true; // если это не первый запуск, то истина = новый бар
old_Times[i]=new_Time[0]; // запоминаем время бара
}
}
//----return(res);
}
//+------------------------------------------------------------------+
double DPO_fast_c_value=NormalizeDouble(fDPOVal[1],6); // запоминаем значение индикатора DPO fast на предыдущем бареdouble DPO_slow_c_value=NormalizeDouble(sDPOVal[0],6); // запоминаем значение индикатора DPO slow на предыдущем бареdouble DPO_fast_p_value=NormalizeDouble(fDPOVal[0],6); // запоминаем значение индикатора DPO fast на пред-предыдущем бареdouble DPO_slow_p_value=NormalizeDouble(sDPOVal[1],6); // запоминаем значение индикатора DPO slow на пред-предыдущем баре
Подскажите следующее. В функции ОнТестер рассчитываются два параметра. Существует ли возможность при оптимизации по одному параметру, второй параметр просто выводить в таблицу оптимизации??? И как это сделать если да?. Спасибо!
Как в коде получить значение версии MQL5 программы, определяемой property# version ?
Я использую вот так, другого варианта не нашёл. Прописать версию нужно 2 раза, но это не настолько сложно
Добрый день, уважаемые эксперты.
Подскажите, пожалуйста, где в коде ошибка, которая не позволяет открыться позиции BUY на одном баре с SELL, который закрыл предыдущую позицию?
Правила простые (чтобы научиться):
1 Вход- пересечение медленным индикатором 0 + быстрый также в зоне (покупка/продажа)
2 Выход - пересечение быстрым индикатором 0
Добрый день, уважаемые эксперты.
Подскажите, пожалуйста, где в коде ошибка, которая не позволяет открыться позиции BUY на одном баре с SELL, который закрыл предыдущую позицию?
Правила простые (чтобы научиться):
1 Вход- пересечение медленным индикатором 0 + быстрый также в зоне (покупка/продажа)
2 Выход - пересечение быстрым индикатором 0
Все правильно работает: условия открытия пересечение медленного индикатора 0 линии, в указанном месте только быстрый индикатор пересек 0 линию.
Для открытия позиции в указанном месте нужно добавить условие, медленный в той же зоне, а быстрый пересекает 0 линию
Добрый день, уважаемые эксперты.
Подскажите, пожалуйста, где в коде ошибка, которая не позволяет открыться позиции BUY на одном баре с SELL, который закрыл предыдущую позицию?
Правила простые (чтобы научиться):
1 Вход- пересечение медленным индикатором 0 + быстрый также в зоне (покупка/продажа)
2 Выход - пересечение быстрым индикатором 0
Вы делаете грубейшую ошибку: Вы НА КАЖДОМ ТИКЕ СОЗДАЁТЕ ПО ДВА ИНЛИКАТОРА!
Хендл индикатора НУЖНО СОЗАВАТЬ ОДИН РАЗ в OnInit.
Пожалуйста почитайте справку iCustom.
Добрый день, уважаемые эксперты.
Подскажите, пожалуйста, где в коде ошибка, которая не позволяет открыться позиции BUY на одном баре с SELL, который закрыл предыдущую позицию?
Правила простые (чтобы научиться):
1 Вход- пересечение медленным индикатором 0 + быстрый также в зоне (покупка/продажа)
2 Выход - пересечение быстрым индикатором 0
я тут пытаюсь разобраться с вашем кодом - пока только запустил его, ведь не весь код, Вы выложили
Ваш код - и мои до -думки .
Спасибо откликнувшимся.
Но остается проблема того, что при закрытии ордера и наличии сигнала на этом же баре позиция не открывается.
Подскажи, пожалуйста, с чем это может быть связано и как это можно исправить?
Спасибо откликнувшимся.
Но остается проблема того, что при закрытии ордера и наличии сигнала на этом же баре позиция не открывается.
Подскажи, пожалуйста, с чем это может быть связано и как это можно исправить?
На вскидку: Вы проверяете новый бар:
и только потом ищите сигнал. Получается если Вы уже были на этом баре Вы в него не попадёте уже.
может что то так ?
может что то так ?
если здесь сменить цифры
чище работает
Коллеги приветствую!
Подскажите следующее. В функции ОнТестер рассчитываются два параметра. Существует ли возможность при оптимизации по одному параметру, второй параметр просто выводить в таблицу оптимизации??? И как это сделать если да?. Спасибо!