Vladymyr Glushko : Ama işte adım adım nasıl yapılır?..... grafik nesneleri (nedir ve nasıl yerleştirilir), grafikte verilerle etiketler (nereye girilir ve hangi verilerle) ...... aptal sorular için üzgünüm.
Programlı olarak.
İhtiyacınız olan verilerle bir bilgi göstergesi yazmanız gerekir.
strongflex : Ayrıca, RSI 20 dakika önce seviyeyi geçtiyse fiyatı kontrol ederiz, yani kısacası fiyat 20 dakika öncesinden daha düşük olmalıdır. Çok teşekkürler. Her şey benimle çalışırsa söz verdim))
MQL5'e mümkün olduğunca yakın yaptığımız için, bar kaydırmasını zamanında almak ve kapanış fiyatlarını almak için MQL4 fonksiyonlarını kullanmıyoruz (sırasıyla iBarShift() ve iClose()).
Bunun için kendi fonksiyonlarımızı yapıyoruz: GetBarShift() ve GetPriceClose(). Ek olarak, standart MQL4 işlevlerini terk ettiğimiz için iTime() yerine GetTime() işlevini kullanarak çubuk zamanını almamız gerekecek.
İşte test danışmanı:
//+------------------------------------------------------------------+ //| 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 MinutesBefore = 20 ; // Количество минут назад //--- global variables int minutesBefore; // Количество минут назад int periodRSI; // Период расчёта 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); //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ voidOnDeinit ( constint reason) { //---
} //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ voidOnTick () { //--- int shift_0; int shift_1; //--- MqlDateTime server_time; TimeToStruct ( TimeCurrent (),server_time); string tf= EnumToString (TimeframeRSI); //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0 if (server_time.min%minutesBefore== 0 || server_time.min== 0 ) { //--- время 1x и 2x минут назад timeBefore= TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 ); timePrevBefore= TimeCurrent ()- 2 *minutesBefore* PeriodSeconds ( PERIOD_M1 ); //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15) shift_0=GetBarShift( Symbol (),TimeframeRSI,timeBefore); shift_1=GetBarShift( Symbol (),TimeframeRSI,timePrevBefore); //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15) prevRSIvalue0=GetLastDataRSI( Symbol (),TimeframeRSI,shift_0); prevRSIvalue1=GetLastDataRSI( Symbol (),TimeframeRSI,shift_1); //--- значения цен закрытия баров 1х и 2х минут назад prevClose_0=GetPriceClose( Symbol (),TimeframeRSI,shift_0); prevClose_1=GetPriceClose( Symbol (),TimeframeRSI,shift_1); } Comment ( "\nТекущее время: " , TimeCurrent (), "\nВремя " ,minutesBefore, " минут назад: " , TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 ), "\nБар " ,tf, "_0=" ,shift_0, ", бар " ,tf, "_1=" ,shift_1, "\nМинуты текущего времени: " ,server_time.min, "\nЗначение RSI " ,minutesBefore, " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue0, 4 ), "\nЗначение RSI " ,minutesBefore* 2 , " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue1, 4 ), //--- "\nЗначение Close " ,minutesBefore, " минут назад > " ,tf, " : " , DoubleToString (prevClose_0, Digits ()), "\nЗначение Close " ,minutesBefore* 2 , " минут назад > " ,tf, " : " , DoubleToString (prevClose_1, Digits ()) ); } //+------------------------------------------------------------------+ 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 ); } //+------------------------------------------------------------------+
Şimdi, RSI verilerinin doğru zamanda alınmasını ayrı bir işlevde düzenlemeniz ve fiyatları ve RSI değerlerini karşılaştırmanız gerekecek.
MQL5'e mümkün olduğunca yakın yaptığımız için, bar kaydırmasını zamanında almak ve kapanış fiyatlarını almak için MQL4 fonksiyonlarını kullanmıyoruz (sırasıyla iBarShift() ve iClose()).
Bunun için kendi fonksiyonlarımızı yapıyoruz: GetBarShift() ve GetPriceClose(). Ek olarak, standart MQL4 işlevlerini terk ettiğimiz için iTime() yerine GetTime() işlevini kullanarak çubuk zamanını almamız gerekecek.
İşte test danışmanı:
//+------------------------------------------------------------------+ //| 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 MinutesBefore = 20 ; // Количество минут назад //--- global variables int minutesBefore; // Количество минут назад int periodRSI; // Период расчёта 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); //--- return ( INIT_SUCCEEDED ); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ voidOnDeinit ( constint reason) { //---
} //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ voidOnTick () { //--- int shift_0; int shift_1; //--- MqlDateTime server_time; TimeToStruct ( TimeCurrent (),server_time); string tf= EnumToString (TimeframeRSI); //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0 if (server_time.min%minutesBefore== 0 || server_time.min== 0 ) { //--- время 1x и 2x минут назад timeBefore= TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 ); timePrevBefore= TimeCurrent ()- 2 *minutesBefore* PeriodSeconds ( PERIOD_M1 ); //--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15) shift_0=GetBarShift( Symbol (),TimeframeRSI,timeBefore); shift_1=GetBarShift( Symbol (),TimeframeRSI,timePrevBefore); //--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15) prevRSIvalue0=GetLastDataRSI( Symbol (),TimeframeRSI,shift_0); prevRSIvalue1=GetLastDataRSI( Symbol (),TimeframeRSI,shift_1); //--- значения цен закрытия баров 1х и 2х минут назад prevClose_0=GetPriceClose( Symbol (),TimeframeRSI,shift_0); prevClose_1=GetPriceClose( Symbol (),TimeframeRSI,shift_1); } Comment ( "\nТекущее время: " , TimeCurrent (), "\nВремя " ,minutesBefore, " минут назад: " , TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 ), "\nБар " ,tf, "_0=" ,shift_0, ", бар " ,tf, "_1=" ,shift_1, "\nМинуты текущего времени: " ,server_time.min, "\nЗначение RSI " ,minutesBefore, " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue0, 4 ), "\nЗначение RSI " ,minutesBefore* 2 , " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue1, 4 ), //--- "\nЗначение Close " ,minutesBefore, " минут назад > " ,tf, " : " , DoubleToString (prevClose_0, Digits ()), "\nЗначение Close " ,minutesBefore* 2 , " минут назад > " ,tf, " : " , DoubleToString (prevClose_1, Digits ()) ); } //+------------------------------------------------------------------+ 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 ); } //+------------------------------------------------------------------+
Şimdi, RSI verilerinin doğru zamanda alınmasını ayrı bir işlevde düzenlemeniz ve fiyatları ve RSI değerlerini karşılaştırmanız gerekecek.
yürütüldüğünde herhangi bir değişkenin değerini manuel olarak ayarlayabileceğiniz bir pencere görüntüleyen bir olay yaratın.
Yaklaşık olarak Extern aracılığıyla bir değişken ayarlarken olanla aynıdır, ancak program yürütme sırasında otomatik olarak ve başlangıçta bir kez değil.
En azından hangi yolu kazacağımı söylersen minnettar olurum.
yürütüldüğünde herhangi bir değişkenin değerini manuel olarak ayarlayabileceğiniz bir pencere görüntüleyen bir olay yaratın.
Yaklaşık olarak Extern aracılığıyla bir değişken ayarlarken olanla aynıdır, ancak program yürütme sırasında otomatik olarak ve başlangıçta bir kez değil.
En azından hangi yolu kazacağımı söylersen minnettar olurum.
Teşekkür ederim!
Kod tabanını kazın, grafikte bir panel ile buna benzer bir şey zaten var. İşte nasıl olduğu , örneğin.
yürütüldüğünde herhangi bir değişkenin değerini manuel olarak ayarlayabileceğiniz bir pencere görüntüleyen bir olay yaratın.
Yaklaşık olarak Extern aracılığıyla bir değişken ayarlarken olanla aynıdır, ancak program yürütme sırasında otomatik olarak ve başlangıçta bir kez değil.
En azından hangi yolu kazacağımı söylersen minnettar olurum.
Teşekkür ederim!
Grafik nesnelere doğru kazın. Özellikle giriş alanı - OBJ_EDIT
İşte grafikte oluşturmak için bir fonksiyon:
//+------------------------------------------------------------------+ void SetEditField( constlong chart_id= 0 , // ID графика conststring name= "Edit" , // имя объекта constint sub_window= 0 , // номер подокна constint x= 0 , // координата по оси X constint y= 0 , // координата по оси Y constint width= 50 , // ширина поля ввода constint height= 18 , // высота поля ввода conststring text= "Text" , // текст conststring font= "Calibri" , // шрифт constint font_size= 8 , // размер шрифта constENUM_ALIGN_MODE align= ALIGN_CENTER , // способ выравнивания constENUM_BASE_CORNER corner= CORNER_LEFT_UPPER , // угол графика для привязки constlong z_order= 0 , // приоритет на нажатие мышью constcolor clr= clrBlack , // цвет текста constcolor back_clr= clrWhite , // цвет фона constcolor border_clr= clrNONE , // цвет границы constbool back= false , // на заднем плане constbool read_only= false , // возможность редактировать constbool selection= false , // выделить для перемещений constbool hidden= true ) // скрыт в списке объектов { if ( ObjectFind (chart_id,name)< 0 ) ObjectCreate (chart_id,name, OBJ_EDIT ,sub_window, 0 , 0 ); ObjectSetInteger (chart_id,name, OBJPROP_XDISTANCE ,x); ObjectSetInteger (chart_id,name, OBJPROP_YDISTANCE ,y); ObjectSetInteger (chart_id,name, OBJPROP_XSIZE ,width); ObjectSetInteger (chart_id,name, OBJPROP_YSIZE ,height); ObjectSetString (chart_id,name, OBJPROP_TEXT ,text); ObjectSetString (chart_id,name, OBJPROP_FONT ,font); ObjectSetInteger (chart_id,name, OBJPROP_FONTSIZE ,font_size); ObjectSetInteger (chart_id,name, OBJPROP_ALIGN ,align); ObjectSetInteger (chart_id,name, OBJPROP_READONLY ,read_only); ObjectSetInteger (chart_id,name, OBJPROP_CORNER ,corner); ObjectSetInteger (chart_id,name, OBJPROP_COLOR ,clr); ObjectSetInteger (chart_id,name, OBJPROP_BGCOLOR ,back_clr); ObjectSetInteger (chart_id,name, OBJPROP_BORDER_COLOR ,border_clr); ObjectSetInteger (chart_id,name, OBJPROP_BACK ,back); ObjectSetInteger (chart_id,name, OBJPROP_SELECTABLE ,selection); ObjectSetInteger (chart_id,name, OBJPROP_SELECTED ,selection); ObjectSetInteger (chart_id,name, OBJPROP_HIDDEN ,hidden); ObjectSetInteger (chart_id,name, OBJPROP_ZORDER ,z_order); } //+------------------------------------------------------------------+
Ama işte adım adım nasıl yapılır?..... grafik nesneleri (nedir ve nasıl yerleştirilir), grafikte verilerle etiketler (nereye girilir ve hangi verilerle) ...... aptal sorular için üzgünüm.
Programlı olarak.
İhtiyacınız olan verilerle bir bilgi göstergesi yazmanız gerekir.
Ayrıca, RSI 20 dakika önce seviyeyi geçtiyse fiyatı kontrol ederiz, yani kısacası fiyat 20 dakika öncesinden daha düşük olmalıdır. Çok teşekkürler. Her şey benimle çalışırsa söz verdim))
MQL5'e mümkün olduğunca yakın yaptığımız için, bar kaydırmasını zamanında almak ve kapanış fiyatlarını almak için MQL4 fonksiyonlarını kullanmıyoruz (sırasıyla iBarShift() ve iClose()).
Bunun için kendi fonksiyonlarımızı yapıyoruz: GetBarShift() ve GetPriceClose(). Ek olarak, standart MQL4 işlevlerini terk ettiğimiz için iTime() yerine GetTime() işlevini kullanarak çubuk zamanını almamız gerekecek.
İşte test danışmanı:
//| 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 MinutesBefore = 20 ; // Количество минут назад
//--- global variables
int minutesBefore; // Количество минут назад
int periodRSI; // Период расчёта 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);
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
//---
int shift_0;
int shift_1;
//---
MqlDateTime server_time;
TimeToStruct ( TimeCurrent (),server_time);
string tf= EnumToString (TimeframeRSI);
//--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
if (server_time.min%minutesBefore== 0 || server_time.min== 0 ) {
//--- время 1x и 2x минут назад
timeBefore= TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 );
timePrevBefore= TimeCurrent ()- 2 *minutesBefore* PeriodSeconds ( PERIOD_M1 );
//--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
shift_0=GetBarShift( Symbol (),TimeframeRSI,timeBefore);
shift_1=GetBarShift( Symbol (),TimeframeRSI,timePrevBefore);
//--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
prevRSIvalue0=GetLastDataRSI( Symbol (),TimeframeRSI,shift_0);
prevRSIvalue1=GetLastDataRSI( Symbol (),TimeframeRSI,shift_1);
//--- значения цен закрытия баров 1х и 2х минут назад
prevClose_0=GetPriceClose( Symbol (),TimeframeRSI,shift_0);
prevClose_1=GetPriceClose( Symbol (),TimeframeRSI,shift_1);
}
Comment ( "\nТекущее время: " , TimeCurrent (),
"\nВремя " ,minutesBefore, " минут назад: " , TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 ),
"\nБар " ,tf, "_0=" ,shift_0, ", бар " ,tf, "_1=" ,shift_1,
"\nМинуты текущего времени: " ,server_time.min,
"\nЗначение RSI " ,minutesBefore, " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue0, 4 ),
"\nЗначение RSI " ,minutesBefore* 2 , " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue1, 4 ),
//---
"\nЗначение Close " ,minutesBefore, " минут назад > " ,tf, " : " , DoubleToString (prevClose_0, Digits ()),
"\nЗначение Close " ,minutesBefore* 2 , " минут назад > " ,tf, " : " , DoubleToString (prevClose_1, Digits ())
);
}
//+------------------------------------------------------------------+
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 );
}
//+------------------------------------------------------------------+
Şimdi, RSI verilerinin doğru zamanda alınmasını ayrı bir işlevde düzenlemeniz ve fiyatları ve RSI değerlerini karşılaştırmanız gerekecek.
MQL5'e mümkün olduğunca yakın yaptığımız için, bar kaydırmasını zamanında almak ve kapanış fiyatlarını almak için MQL4 fonksiyonlarını kullanmıyoruz (sırasıyla iBarShift() ve iClose()).
Bunun için kendi fonksiyonlarımızı yapıyoruz: GetBarShift() ve GetPriceClose(). Ek olarak, standart MQL4 işlevlerini terk ettiğimiz için iTime() yerine GetTime() işlevini kullanarak çubuk zamanını almamız gerekecek.
İşte test danışmanı:
//| 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 MinutesBefore = 20 ; // Количество минут назад
//--- global variables
int minutesBefore; // Количество минут назад
int periodRSI; // Период расчёта 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);
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick ()
{
//---
int shift_0;
int shift_1;
//---
MqlDateTime server_time;
TimeToStruct ( TimeCurrent (),server_time);
string tf= EnumToString (TimeframeRSI);
//--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
if (server_time.min%minutesBefore== 0 || server_time.min== 0 ) {
//--- время 1x и 2x минут назад
timeBefore= TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 );
timePrevBefore= TimeCurrent ()- 2 *minutesBefore* PeriodSeconds ( PERIOD_M1 );
//--- смещение в барах времени 1х и 2х для заданного таймфрейма RSI (тф М15)
shift_0=GetBarShift( Symbol (),TimeframeRSI,timeBefore);
shift_1=GetBarShift( Symbol (),TimeframeRSI,timePrevBefore);
//--- значения RSI на барах 1х и 2х минут назад для заданного таймфрейма RSI (тф М15)
prevRSIvalue0=GetLastDataRSI( Symbol (),TimeframeRSI,shift_0);
prevRSIvalue1=GetLastDataRSI( Symbol (),TimeframeRSI,shift_1);
//--- значения цен закрытия баров 1х и 2х минут назад
prevClose_0=GetPriceClose( Symbol (),TimeframeRSI,shift_0);
prevClose_1=GetPriceClose( Symbol (),TimeframeRSI,shift_1);
}
Comment ( "\nТекущее время: " , TimeCurrent (),
"\nВремя " ,minutesBefore, " минут назад: " , TimeCurrent ()-minutesBefore* PeriodSeconds ( PERIOD_M1 ),
"\nБар " ,tf, "_0=" ,shift_0, ", бар " ,tf, "_1=" ,shift_1,
"\nМинуты текущего времени: " ,server_time.min,
"\nЗначение RSI " ,minutesBefore, " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue0, 4 ),
"\nЗначение RSI " ,minutesBefore* 2 , " минут назад на " ,tf, " : " , DoubleToString (prevRSIvalue1, 4 ),
//---
"\nЗначение Close " ,minutesBefore, " минут назад > " ,tf, " : " , DoubleToString (prevClose_0, Digits ()),
"\nЗначение Close " ,minutesBefore* 2 , " минут назад > " ,tf, " : " , DoubleToString (prevClose_1, Digits ())
);
}
//+------------------------------------------------------------------+
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 );
}
//+------------------------------------------------------------------+
Şimdi, RSI verilerinin doğru zamanda alınmasını ayrı bir işlevde düzenlemeniz ve fiyatları ve RSI değerlerini karşılaştırmanız gerekecek.
{
ticket= OrderSend ( Symbol (), OP_SELL , 0.1 , Ask , Slippage, 0 , 0 , NULL , Magic, 0 , Blue);
return ( 0 );
}
{
int ticket;
if ( OrdersTotal () == 0 )
{
ticket= OrderSend ( Symbol (), OP_SELL , 1 , Bid , 0 , 0 , 0 , NULL , 1234 , 0 , Red);
}
return ( 0 );
}
Kodun sonuna kontrol etmek için şunu ekledim:
{
int ticket;
if ( OrdersTotal () == 0 )
{
ticket= OrderSend ( Symbol (), OP_SELL , 1 , Bid , 0 , 0 , 0 , NULL , 1234 , 0 , Red);
}
return ( 0 );
}
Hata kodunu görüntülemenizi engelleyen nedir?
Hata kodunu görüntülemenizi engelleyen nedir?
Sevgili forum kullanıcıları! Soru:
kene bloğunda mümkün mü
int start() {}
yürütüldüğünde herhangi bir değişkenin değerini manuel olarak ayarlayabileceğiniz bir pencere görüntüleyen bir olay yaratın.
Yaklaşık olarak Extern aracılığıyla bir değişken ayarlarken olanla aynıdır, ancak program yürütme sırasında otomatik olarak ve başlangıçta bir kez değil.
En azından hangi yolu kazacağımı söylersen minnettar olurum.
Teşekkür ederim!
Sevgili forum kullanıcıları! Soru:
kene bloğunda mümkün mü
int start() {}
yürütüldüğünde herhangi bir değişkenin değerini manuel olarak ayarlayabileceğiniz bir pencere görüntüleyen bir olay yaratın.
Yaklaşık olarak Extern aracılığıyla bir değişken ayarlarken olanla aynıdır, ancak program yürütme sırasında otomatik olarak ve başlangıçta bir kez değil.
En azından hangi yolu kazacağımı söylersen minnettar olurum.
Teşekkür ederim!
Sevgili forum kullanıcıları! Soru:
kene bloğunda mümkün mü
int start() {}
yürütüldüğünde herhangi bir değişkenin değerini manuel olarak ayarlayabileceğiniz bir pencere görüntüleyen bir olay yaratın.
Yaklaşık olarak Extern aracılığıyla bir değişken ayarlarken olanla aynıdır, ancak program yürütme sırasında otomatik olarak ve başlangıçta bir kez değil.
En azından hangi yolu kazacağımı söylersen minnettar olurum.
Teşekkür ederim!
Grafik nesnelere doğru kazın. Özellikle giriş alanı - OBJ_EDIT
İşte grafikte oluşturmak için bir fonksiyon:
void SetEditField( const long chart_id= 0 , // ID графика
const string name= "Edit" , // имя объекта
const int sub_window= 0 , // номер подокна
const int x= 0 , // координата по оси X
const int y= 0 , // координата по оси Y
const int width= 50 , // ширина поля ввода
const int height= 18 , // высота поля ввода
const string text= "Text" , // текст
const string font= "Calibri" , // шрифт
const int font_size= 8 , // размер шрифта
const ENUM_ALIGN_MODE align= ALIGN_CENTER , // способ выравнивания
const ENUM_BASE_CORNER corner= CORNER_LEFT_UPPER , // угол графика для привязки
const long z_order= 0 , // приоритет на нажатие мышью
const color clr= clrBlack , // цвет текста
const color back_clr= clrWhite , // цвет фона
const color border_clr= clrNONE , // цвет границы
const bool back= false , // на заднем плане
const bool read_only= false , // возможность редактировать
const bool selection= false , // выделить для перемещений
const bool hidden= true ) // скрыт в списке объектов
{
if ( ObjectFind (chart_id,name)< 0 ) ObjectCreate (chart_id,name, OBJ_EDIT ,sub_window, 0 , 0 );
ObjectSetInteger (chart_id,name, OBJPROP_XDISTANCE ,x);
ObjectSetInteger (chart_id,name, OBJPROP_YDISTANCE ,y);
ObjectSetInteger (chart_id,name, OBJPROP_XSIZE ,width);
ObjectSetInteger (chart_id,name, OBJPROP_YSIZE ,height);
ObjectSetString (chart_id,name, OBJPROP_TEXT ,text);
ObjectSetString (chart_id,name, OBJPROP_FONT ,font);
ObjectSetInteger (chart_id,name, OBJPROP_FONTSIZE ,font_size);
ObjectSetInteger (chart_id,name, OBJPROP_ALIGN ,align);
ObjectSetInteger (chart_id,name, OBJPROP_READONLY ,read_only);
ObjectSetInteger (chart_id,name, OBJPROP_CORNER ,corner);
ObjectSetInteger (chart_id,name, OBJPROP_COLOR ,clr);
ObjectSetInteger (chart_id,name, OBJPROP_BGCOLOR ,back_clr);
ObjectSetInteger (chart_id,name, OBJPROP_BORDER_COLOR ,border_clr);
ObjectSetInteger (chart_id,name, OBJPROP_BACK ,back);
ObjectSetInteger (chart_id,name, OBJPROP_SELECTABLE ,selection);
ObjectSetInteger (chart_id,name, OBJPROP_SELECTED ,selection);
ObjectSetInteger (chart_id,name, OBJPROP_HIDDEN ,hidden);
ObjectSetInteger (chart_id,name, OBJPROP_ZORDER ,z_order);
}
//+------------------------------------------------------------------+