Könnten Sie mir bitte sagen, wo im Code ein Fehler auftritt, der verhindert, dass eine BUY-Position auf demselben Balken mit SELL eröffnet wird, der eine vorherige Position geschlossen hat?
Die Regeln sind einfach (zu lernen): 1 Einstieg - langsamer Indikator über 0 + schneller Indikator ebenfalls in der Zone (Kauf/Verkauf)
2 Ausfahrt - Überfahrt mit dem Schnellanzeiger 0
Ich versuche, Ihren Code zu verstehen - ich führe ihn gerade aus, nicht alles, was Sie dargelegt haben
Ihr Code - und meine Gedanken .
Реверс добавил и Индикатор в положенное место переставил
//+------------------------------------------------------------------+//| 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())
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()
{
//--- в статической переменной будем помнить время открытия последнего бараstaticdatetime 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);
}
//--- дошли до этого места - значит бар не новый, вернем falsereturn(false);
}
//+------------------------------------------------------------------+
Das Problem besteht jedoch darin, dass die Position nicht geöffnet wird, wenn ein Auftrag geschlossen wird und ein Signal auf demselben Balken auftaucht.
Können Sie mir bitte sagen, woran das liegen könnte und wie das Problem behoben werden kann?
Das Problem besteht jedoch darin, dass die Position nicht geöffnet wird, wenn ein Auftrag geschlossen wird und ein Signal auf demselben Balken auftaucht.
Können Sie mir bitte sagen, woran das liegen könnte und wie man es beheben kann?
//+------------------------------------------------------------------+//| 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 на пред-предыдущем баре
Bitte teilen Sie uns Folgendes mit. Die Funktion OnTester berechnet zwei Parameter. Gibt es eine Möglichkeit, dass bei der Optimierung auf einen Parameter der zweite Parameter einfach in der Optimierungstabelle ausgegeben wird? Und wenn ja, wie ist dies zu tun? Ich danke Ihnen!
Hallo zusammen!!! Könnt ihr mir sagen, ob es möglich ist, den Kursverlauf in mt5 zu laden? Suche seit 2 Tagen nach Informationen, finde aber nicht heraus
Igorz2006: Können Sie mir sagen, ob es möglich ist, den Kursverlauf in mt5 zu laden? Ich habe 2 Tage lang nach Informationen gesucht, aber ich kann es nicht heraus finden
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
Igorz2006: Ist es möglich, die Kurshistorie in mt5 zu laden? Ich suche schon seit 2 Tagen nach Informationen, kann sie aber nicht finden.
Es gibt kein HistoryCenter Ding (wie in 4). drücken Sie einfach PgUp. überprüfen Sie auch in den Einstellungen, wie viele Balken für das Diagramm erlaubt sind.
Guten Tag, liebe Experten.
Könnten Sie mir bitte sagen, wo im Code ein Fehler auftritt, der verhindert, dass eine BUY-Position auf demselben Balken mit SELL eröffnet wird, der eine vorherige Position geschlossen hat?
Die Regeln sind einfach (zu lernen):
1 Einstieg - langsamer Indikator über 0 + schneller Indikator ebenfalls in der Zone (Kauf/Verkauf)
2 Ausfahrt - Überfahrt mit dem Schnellanzeiger 0
Ich versuche, Ihren Code zu verstehen - ich führe ihn gerade aus, nicht alles, was Sie dargelegt haben
Ihr Code - und meine Gedanken .
Danke an alle, die geantwortet haben.
Das Problem besteht jedoch darin, dass die Position nicht geöffnet wird, wenn ein Auftrag geschlossen wird und ein Signal auf demselben Balken auftaucht.
Können Sie mir bitte sagen, woran das liegen könnte und wie das Problem behoben werden kann?
Danke an alle, die geantwortet haben.
Das Problem besteht jedoch darin, dass die Position nicht geöffnet wird, wenn ein Auftrag geschlossen wird und ein Signal auf demselben Balken auftaucht.
Können Sie mir bitte sagen, woran das liegen könnte und wie man es beheben kann?
Mit einem kurzen Blick prüfen Sie, ob eine neue Bar vorhanden ist:
und erst dann nach einem Signal suchen. Es stellt sich heraus, dass Sie diesen Balken nicht treffen werden, wenn Sie bereits auf ihm gestanden haben.
vielleicht so etwas wie das hier?
vielleicht so etwas wie das hier?
Wenn Sie die Zahlen hier ändern.
es ist sauberer.
Liebe Kolleginnen und Kollegen!
Bitte teilen Sie uns Folgendes mit. Die Funktion OnTester berechnet zwei Parameter. Gibt es eine Möglichkeit, dass bei der Optimierung auf einen Parameter der zweite Parameter einfach in der Optimierungstabelle ausgegeben wird? Und wenn ja, wie ist dies zu tun? Ich danke Ihnen!
Können Sie mir sagen, ob es möglich ist, den Kursverlauf in mt5 zu laden? Ich habe 2 Tage lang nach Informationen gesucht, aber ich kann es nicht heraus finden
Funktionen:
CopyRates
Ruft die Verlaufsdaten der Tarifstruktur für das angegebene Symbol und den angegebenen Zeitraum in einem Array ab
CopyTime
Abrufen von Verlaufsdaten zur Bar-Eröffnungszeit für ein bestimmtes Symbol und einen bestimmten Zeitraum in einem Array
CopyOpen
Ruft historische Daten zum Eröffnungskurs eines Balkens für ein bestimmtes Symbol und einen bestimmten Zeitraum in einem Array ab
KopierenHoch
Ruft Historiendaten zum maximalen Barpreis für ein angegebenes Symbol und einen Zeitraum in einem Array ab
CopyLow
Ruft Historiendaten zum minimalen Barpreis für ein angegebenes Symbol und einen Zeitraum in einem Array ab
CopyClose
Ruft Historiendaten zum Bar-Close-Preis für ein angegebenes Symbol und einen Zeitraum in einem Array ab
CopyTickVolume
Ruft historische Daten über Tick-Volumen für ein angegebenes Symbol und einen Zeitraum in einem Array ab
CopyRealVolume
Ruft historische Daten zum Handelsvolumen für ein bestimmtes Symbol und einen bestimmten Zeitraum in einem Array ab
CopySpread
Ruft historische Daten zu Spreads für ein bestimmtes Symbol und einen bestimmten Zeitraum in einem Array ab
CopyTicks
Holt Verlaufsdaten zu Ticks im MqlTick-Format in ein Array
CopyTicksRange
Holt die Zecken im angegebenen Datumsbereich in ein Array
Ist es möglich, die Kurshistorie in mt5 zu laden? Ich suche schon seit 2 Tagen nach Informationen, kann sie aber nicht finden.
Es gibt kein HistoryCenter Ding (wie in 4). drücken Sie einfach PgUp. überprüfen Sie auch in den Einstellungen, wie viele Balken für das Diagramm erlaubt sind.