//+------------------------------------------------------------------+//| 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 на пред-предыдущем баре
Aconselha-se o seguinte. A função OnTester calcula dois parâmetros. Existe a possibilidade de, ao optimizar um parâmetro, o segundo parâmetro ser simplesmente produzido na tabela de optimização?? E como fazer isto se sim? Obrigado!
Igorz2006: Olá a todos! Podem dizer-me, é possível carregar o histórico das citações em mt5? Estou à procura de informação há 2 dias, mas não consigo descobrir
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
Igorz2006: É possível carregar o histórico das citações em mt5? Ando à procura de informação há 2 dias, mas não a encontro.
Não há nenhuma coisa do HistoryCenter (como em 4). basta pressionar PgUp. também verificar nas definições quantas barras para o gráfico são permitidas.
Boa tarde, caros peritos.
Poderia dizer-me onde no código existe um erro que impede a abertura da posição COMPRAR na mesma barra com VENDA que fechou uma posição anterior?
As regras são simples (para aprender):
1 Entrada - passagem lenta do indicador 0 + rápida também na zona (compra/venda)
2 Saída - passagem por indicador rápido 0
Estou a tentar descobrir o seu código - estou apenas a executá-lo agora, não todo, já o expôs
O seu código - e os meus pensamentos .
Graças a todos os que responderam.
Mas o problema permanece: quando uma ordem é fechada e há um sinal na mesma barra, a posição não se abre.
Pode dizer-me do que se trata e como pode ser corrigido?
Graças a todos os que responderam.
Mas o problema permanece: quando uma ordem é fechada e há um sinal na mesma barra, a posição não se abre.
Pode dizer-me, por favor, do que se trata e como resolver o problema?
Num relance rápido, procura-se um novo bar:
e só depois procurar um sinal. Acontece que, se já esteve neste bar, não entrará nele.
talvez algo como isto ?
talvez algo parecido com isto?
Se alterar os números aqui.
é mais limpo.
Saudações Colegas!
Aconselha-se o seguinte. A função OnTester calcula dois parâmetros. Existe a possibilidade de, ao optimizar um parâmetro, o segundo parâmetro ser simplesmente produzido na tabela de optimização?? E como fazer isto se sim? Obrigado!
Olá a todos! Podem dizer-me, é possível carregar o histórico das citações em mt5? Estou à procura de informação há 2 dias, mas não consigo descobrir
Funções:
CopyRates
Obtém dados históricos da estrutura de Tarifas para um símbolo e período especificados numa matriz
CopyTime
Obtém dados do histórico sobre o tempo de abertura do bar para um símbolo e período especificados numa matriz
CopyOpen
Obtém dados históricos sobre o preço de abertura de bares para um símbolo e período especificados numa matriz
CopyHigh
Obtém dados do histórico sobre o preço máximo da barra para um símbolo e período especificados numa matriz
CopyLow
Obtém dados do histórico sobre o preço mínimo da barra para um símbolo e período especificados numa matriz
CopyCloseFechar
Obtém dados históricos sobre o preço de fecho de barra para um símbolo e período especificados numa matriz
CopyTickVolume
Obtém dados históricos sobre volumes de carrapatos para um símbolo e período especificados numa matriz
CopyRealVolume
Obtém dados históricos sobre volumes de comércio para um determinado símbolo e período numa matriz
CopySpread
Obtém dados do histórico de spreads para um determinado símbolo e período numa matriz
CopyTicks
Obtém dados do histórico de carraças em formato MqlTick para uma matriz
CopyTicksRange
Obtém carraças no intervalo de datas especificado para uma matriz
É possível carregar o histórico das citações em mt5? Ando à procura de informação há 2 dias, mas não a encontro.
Não há nenhuma coisa do HistoryCenter (como em 4). basta pressionar PgUp. também verificar nas definições quantas barras para o gráfico são permitidas.