//+------------------------------------------------------------------+ //| exTestValueRSI.mq4 | //| Copyright 2016, Artem A. Trishkin, Skype artmedia70 | //| https://login.mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright"Copyright 2016, Artem A. Trishkin, Skype artmedia70" #property link"https://login.mql5.com/ru/users/artmedia70" #property version"1.00" #property strict //--- input parameters inputENUM_TIMEFRAMES TimeframeRSI = PERIOD_M15; // Таймфрейм RSI inputint PeriodRSI = 14; // Период расчёта RSI inputENUM_APPLIED_PRICE PriceRSI = PRICE_CLOSE; // Цена расчёта RSI inputint UpperRSIlevel = 70; // Верхний уровень RSI inputint LowerRSIlevel = 30; // Нижний уровень RSI inputint MinutesBefore =20; // Количество минут назад //--- global variables int minutesBefore; // Количество минут назад int periodRSI; // Период расчёта RSI int upperRSIlevel; // Верхний уровень RSI int lowerRSIlevel; // Нижний уровень RSI //--- double prevRSIvalue0; // Значение RSI для заданного тф xxx минут назад double prevRSIvalue1; // Значение RSI для заданного тф xxx минут назад-x минут //--- double prevClose_0; // Значение Close для заданного тф xxx минут назад double prevClose_1; // Значение Close для заданного тф xxx минут назад-x минут //--- datetime timeBefore; // Время ххх минут назад datetime timePrevBefore; // Время ххх минут назад-x минут //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ intOnInit() { //--- minutesBefore=(MinutesBefore<1?1:MinutesBefore); // Количество минут назад periodRSI=(PeriodRSI<1?1:PeriodRSI); upperRSIlevel=(UpperRSIlevel<1?1:UpperRSIlevel>100?100:UpperRSIlevel); lowerRSIlevel=(LowerRSIlevel<0?0:lowerRSIlevel>99?99:LowerRSIlevel); if(upperRSIlevel<=lowerRSIlevel) upperRSIlevel=lowerRSIlevel+1; if(lowerRSIlevel>=upperRSIlevel) lowerRSIlevel=upperRSIlevel-1; /*
} //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ voidOnTick() { //--- MqlDateTime server_time; TimeToStruct(TimeCurrent(),server_time); //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0 if(server_time.min%minutesBefore==0 || server_time.min==0) { if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) { //--- получили сигнал на покупку Print("Сигнал на покупку ",TimeCurrent()); // Проверочное сообщение в журнал //--- проверка наличия уже открытой позиции на покупку //--- вызов функции открытия позиции на покупку } if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) { //--- получили сигнал на продажу Print("Сигнал на продажу ",TimeCurrent()); // Проверочное сообщение в журнал //--- проверка наличия уже открытой позиции на продажу //--- вызов функции открытия позиции на продажу } } } //+------------------------------------------------------------------+ double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE) { return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift)); } //+------------------------------------------------------------------+ double GetPriceClose(string symbol_name,ENUM_TIMEFRAMES timeframe, int shift){ double array[1]; if(CopyClose(symbol_name,timeframe,shift,1,array)==1) return(array[0]); return(-1); } //+------------------------------------------------------------------+ int GetBarShift(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime time) { if(time<0) return(-1); //--- datetime array[], time0; if(CopyTime(symbol_name,timeframe,0,1,array)<0) return(-1); time0=array[0]; if(CopyTime(symbol_name,timeframe,time0,time,array)<0) return(-1); datetime temptime=GetTime(symbol_name,timeframe,ArraySize(array)-1); if(array[0]==temptime && temptime<=time) return(ArraySize(array)-1); elsereturn(ArraySize(array)); } //+------------------------------------------------------------------+ datetime GetTime(string symbol_name,ENUM_TIMEFRAMES timeframe,int bar) { if(bar<0) return(-1); datetime array[]; if(CopyTime(symbol_name,timeframe,bar,1,array)>0) return(array[0]); return(-1); } //+------------------------------------------------------------------+ int SignalByRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int minutes_before, int upper_lev_rsi=70, int lower_lev_rsi=30) { //--- время 1x и 2x минут назад datetime time_before_0=TimeCurrent()-minutes_before*PeriodSeconds(PERIOD_M1); datetime time_before_1=TimeCurrent()-2*minutes_before*PeriodSeconds(PERIOD_M1); //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15) int shift_0=GetBarShift(symbol_name,timeframe,time_before_0); int shift_1=GetBarShift(symbol_name,timeframe,time_before_1); //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15) double prev_rsi_value_0=GetLastDataRSI(symbol_name,timeframe,shift_0); double prev_rsi_value_1=GetLastDataRSI(symbol_name,timeframe,shift_1); //--- значения цен закрытия баров 1х и 2х минут назад double prev_close_0=GetPriceClose(symbol_name,timeframe,shift_0); double prev_close_1=GetPriceClose(symbol_name,timeframe,shift_1); //--- отладочные сообщения string tf=EnumToString(TimeframeRSI); MqlDateTime server_time; TimeToStruct(TimeCurrent(),server_time); Comment( "\nВремя проверки RSI: ",TimeCurrent(),", минуты времени проверки: ",server_time.min, "\nВремя ",minutes_before," минут назад: ",time_before_0,", бар ",tf," : ",shift_0, "\nВремя ",minutes_before*2," минут назад: ",time_before_1,", бар ",tf," : ",shift_1, "\nЗначение RSI ",minutes_before," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_0,4), "\nЗначение RSI ",minutes_before*2," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_1,4), //--- "\nЗначение Close ",minutes_before," минут назад > ",tf," : ",DoubleToString(prev_close_0,Digits()), "\nЗначение Close ",minutes_before*2," минут назад > ",tf," : ",DoubleToString(prev_close_1,Digits()) ); //--- проверка наличия данных RSI if(prev_rsi_value_1>0 && prev_rsi_value_0>0) { //--- проверка условия на продажу if(prev_rsi_value_1<upper_lev_rsi && prev_rsi_value_0>upper_lev_rsi) { if(prev_close_0>SymbolInfoDouble(symbol_name,SYMBOL_BID)) return(OP_SELL); } //--- проверка условия на покупку if(prev_rsi_value_1>lower_lev_rsi && prev_rsi_value_0<lower_lev_rsi) { if(prev_close_0<SymbolInfoDouble(symbol_name,SYMBOL_ASK)) return(OP_BUY); } } return(-1); } //+------------------------------------------------------------------+
同志よ、私はヒストリーフィッティングをしたことがないので、最適化後のグラフの読み方の複雑さはわからない。
annual pass 2014-2015の後にこのようなグラフがありますが、どこを見ればいいのか、どういう意味なのか?キューブの色と位置に興味を持ちました。なぜ、あるものは中央に、あるものは下または上に、2つまたは3つは同じ正方形にあるのでしょうか?
分かりやすい説明ありがとうございました
テスターでトレードを開始しない。ここで何が問題なのでしょうか)
まあ...まず、Askの価格で売りを建てようとしています。Bidで売り、Askで買いを開いているのに対し。
RSIのデータ検索とそのレベルクロスを関数に落とし込んでみました。また、価格チェックも可能です。買うか、売るか、何もしないか(-1)のシグナルを返します。
//| exTestValueRSI.mq4 |
//| Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//| https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link "https://login.mql5.com/ru/users/artmedia70"
#property version "1.00"
#property strict
//--- input parameters
input ENUM_TIMEFRAMES TimeframeRSI = PERIOD_M15; // Таймфрейм RSI
input int PeriodRSI = 14; // Период расчёта RSI
input ENUM_APPLIED_PRICE PriceRSI = PRICE_CLOSE; // Цена расчёта RSI
input int UpperRSIlevel = 70; // Верхний уровень RSI
input int LowerRSIlevel = 30; // Нижний уровень RSI
input int MinutesBefore =20; // Количество минут назад
//--- global variables
int minutesBefore; // Количество минут назад
int periodRSI; // Период расчёта RSI
int upperRSIlevel; // Верхний уровень RSI
int lowerRSIlevel; // Нижний уровень RSI
//---
double prevRSIvalue0; // Значение RSI для заданного тф xxx минут назад
double prevRSIvalue1; // Значение RSI для заданного тф xxx минут назад-x минут
//---
double prevClose_0; // Значение Close для заданного тф xxx минут назад
double prevClose_1; // Значение Close для заданного тф xxx минут назад-x минут
//---
datetime timeBefore; // Время ххх минут назад
datetime timePrevBefore; // Время ххх минут назад-x минут
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
minutesBefore=(MinutesBefore<1?1:MinutesBefore); // Количество минут назад
periodRSI=(PeriodRSI<1?1:PeriodRSI);
upperRSIlevel=(UpperRSIlevel<1?1:UpperRSIlevel>100?100:UpperRSIlevel);
lowerRSIlevel=(LowerRSIlevel<0?0:lowerRSIlevel>99?99:LowerRSIlevel);
if(upperRSIlevel<=lowerRSIlevel) upperRSIlevel=lowerRSIlevel+1;
if(lowerRSIlevel>=upperRSIlevel) lowerRSIlevel=upperRSIlevel-1;
/*
*/
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
MqlDateTime server_time;
TimeToStruct(TimeCurrent(),server_time);
//--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
if(server_time.min%minutesBefore==0 || server_time.min==0) {
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
//--- получили сигнал на покупку
Print("Сигнал на покупку ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на покупку
//--- вызов функции открытия позиции на покупку
}
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
//--- получили сигнал на продажу
Print("Сигнал на продажу ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на продажу
//--- вызов функции открытия позиции на продажу
}
}
}
//+------------------------------------------------------------------+
double GetLastDataRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift, int period_rsi=14, ENUM_APPLIED_PRICE price_rsi=PRICE_CLOSE) {
return(iRSI(symbol_name,timeframe,period_rsi,price_rsi,shift));
}
//+------------------------------------------------------------------+
double GetPriceClose(string symbol_name,ENUM_TIMEFRAMES timeframe, int shift){
double array[1];
if(CopyClose(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
return(-1);
}
//+------------------------------------------------------------------+
int GetBarShift(string symbol_name,ENUM_TIMEFRAMES timeframe,datetime time) {
if(time<0) return(-1);
//---
datetime array[], time0;
if(CopyTime(symbol_name,timeframe,0,1,array)<0) return(-1);
time0=array[0];
if(CopyTime(symbol_name,timeframe,time0,time,array)<0) return(-1);
datetime temptime=GetTime(symbol_name,timeframe,ArraySize(array)-1);
if(array[0]==temptime && temptime<=time) return(ArraySize(array)-1);
else return(ArraySize(array));
}
//+------------------------------------------------------------------+
datetime GetTime(string symbol_name,ENUM_TIMEFRAMES timeframe,int bar) {
if(bar<0) return(-1);
datetime array[];
if(CopyTime(symbol_name,timeframe,bar,1,array)>0) return(array[0]);
return(-1);
}
//+------------------------------------------------------------------+
int SignalByRSI(string symbol_name, ENUM_TIMEFRAMES timeframe, int minutes_before, int upper_lev_rsi=70, int lower_lev_rsi=30) {
//--- время 1x и 2x минут назад
datetime time_before_0=TimeCurrent()-minutes_before*PeriodSeconds(PERIOD_M1);
datetime time_before_1=TimeCurrent()-2*minutes_before*PeriodSeconds(PERIOD_M1);
//--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
int shift_0=GetBarShift(symbol_name,timeframe,time_before_0);
int shift_1=GetBarShift(symbol_name,timeframe,time_before_1);
//--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
double prev_rsi_value_0=GetLastDataRSI(symbol_name,timeframe,shift_0);
double prev_rsi_value_1=GetLastDataRSI(symbol_name,timeframe,shift_1);
//--- значения цен закрытия баров 1х и 2х минут назад
double prev_close_0=GetPriceClose(symbol_name,timeframe,shift_0);
double prev_close_1=GetPriceClose(symbol_name,timeframe,shift_1);
//--- отладочные сообщения
string tf=EnumToString(TimeframeRSI);
MqlDateTime server_time;
TimeToStruct(TimeCurrent(),server_time);
Comment(
"\nВремя проверки RSI: ",TimeCurrent(),", минуты времени проверки: ",server_time.min,
"\nВремя ",minutes_before," минут назад: ",time_before_0,", бар ",tf," : ",shift_0,
"\nВремя ",minutes_before*2," минут назад: ",time_before_1,", бар ",tf," : ",shift_1,
"\nЗначение RSI ",minutes_before," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_0,4),
"\nЗначение RSI ",minutes_before*2," минут назад на ",tf," : ",DoubleToString(prev_rsi_value_1,4),
//---
"\nЗначение Close ",minutes_before," минут назад > ",tf," : ",DoubleToString(prev_close_0,Digits()),
"\nЗначение Close ",minutes_before*2," минут назад > ",tf," : ",DoubleToString(prev_close_1,Digits())
);
//--- проверка наличия данных RSI
if(prev_rsi_value_1>0 && prev_rsi_value_0>0) {
//--- проверка условия на продажу
if(prev_rsi_value_1<upper_lev_rsi && prev_rsi_value_0>upper_lev_rsi) {
if(prev_close_0>SymbolInfoDouble(symbol_name,SYMBOL_BID)) return(OP_SELL);
}
//--- проверка условия на покупку
if(prev_rsi_value_1>lower_lev_rsi && prev_rsi_value_0<lower_lev_rsi) {
if(prev_close_0<SymbolInfoDouble(symbol_name,SYMBOL_ASK)) return(OP_BUY);
}
}
return(-1);
}
//+------------------------------------------------------------------+
同志よ、私はヒストリーフィッティングをしたことがないので、最適化後のグラフの読み方の複雑さはわからない。
annual pass 2014-2015の後にこのようなグラフがありますが、どこを見ればいいのか、どういう意味なのか?キューブの色や位置に興味を持ちました。なぜ、あるものは中央に、あるものは下または上に、2つまたは3つは同じ正方形にあるのでしょうか?
分かりやすい説明ありがとうございました
私も長年、楽天を信用したことはないのですが......はまり役なんでしょうね。でも、なんとなく色が濃いほうがいいような気がするんですよね。また、飽和色のブロックが多いほど良い。しかし、この混乱をさらにどうすればいいのか、私には考えられません。私は常に適応性のあるシステムを構築することを心がけており、テスターの話を聞いてバカバカしい値を選択するようなことはしていません。
もしかしたら、このことを説明してくれる人がいるかもしれない。
私も長年、オプティマイザーを信用したことはありません。オプティマイザーはいじわるだと思っています。しかし、色は飽和しているほど良いのです。また、飽和色のブロックが多いほど良い。しかし、このままでは次にどうしたらいいのか......考えられません。私は常に適応性のあるシステムを構築することを心がけており、テスターの話を聞いてバカバカしい値を選択するようなことはしていません。
もしかしたら、このことを説明してくれる人がいるかもしれない。
そうですね、誰も説明しない可能性が高いですね。フォーラムに残っているのは10-12人で、そのうちの何人かは追放され、多くの人は戻ってこないでしょう。今、掲示板を見ると、5~7人くらいいて、その半分は質問に答えていない。スケジュールに関する私の質問には答えていない。
第4回フォーラムを見てください。いつだったか、そこでオプティマイザの説明を見たことがあるのですが、どんな内容でどこにあるのかよく覚えていません...。
こんにちは。
外部設定で日付を選択しても、ドロップダウンカレンダーから選択できないのはなぜか教えてください。キーボードから入力するのではなく、日付を選択できるように変更する方法はないでしょうか。
同志よ、私はヒストリーフィッティングをしたことがないので、最適化後のグラフの読み方の複雑さはわからない。
annual pass 2014-2015の後にこのようなグラフがありますが、どこを見ればいいのか、どういう意味なのか?キューブの色と位置に興味を持ちました。なぜ、あるものは中央に、あるものはより低く/より高く、2つ/3つは同じマスにあるのでしょうか?
分かりやすい説明ありがとうございました
そうですね......誰も説明しないでしょう。フォーラムには10~12人しか残っておらず、中には追放された人もいて、二度と戻ってこない人もたくさんいます。今、掲示板を見ると、5〜7人くらいが登場し、その半分は質問に答えない。スケジュールについての私の疑問は解決されないままだった。
説明することがあまりなく、誰も答えてくれない。あなたが示したグラフは意味がなく、どのように得られたのかも謎です。
また、テスターの「最適化グラフ」タブにある「2次元表面」オプションは、EAの2つの入力パラメータを最適化したい場合や、2つのパラメータのどの値で履歴上の結果が良かったか、これらのパラメータは相互に依存しているか、それらが全く意味をなしているかどうかを明確に見たい場合に意味があります(imho)。
2つの入力パラメータを最適化した例です(ベストではないかもしれませんが、今これ以上の例が見つかりません)。
横軸は第1パラメーターの値を16刻みで、縦軸は第2パラメーターの値を同じく16刻みで表示します。緑色の四角が濃いほど、対応するパラメータの値で利益(利益による最適化の場合)が大きく、薄いほど小さいことを表しています。最も良い結果(履歴利益による)を出したのは、中央部でした。その周囲に濃い緑色の「山」があることから、この2つのパラメータには何らかの依存性と規則性があり、パラメータは無意味ではなく、最適化結果もランダムではないことがわかります。ですから、最良の結果(中央)からこの2倍のパラメータの値に注目する価値があります。
一般的には、すべてが非常にシンプルです。使い方は、まあ、想像の域を出ませんね。この緑の四角は長い間見ていない ))
グラフはなぜか両軸とも0しかなく、縦方向にもこの0が3段階に分かれているため、「中央に1つ、下・上に2つ、同じマスに2つ・3つの立方体」となっています。 そして結果は、白と緑の「立方体」がランダムに散らばっているように見えるのですが、いかがでしょうか?だから、このグラフは意味がなく、何の意味もなさないように思える。
こんにちは。
外部設定で日付を選択しても、ドロップダウンカレンダーから選択できないのはなぜか教えてください。キーボードから入力するのではなく、日付を選択できるように変更する方法はありますか?