Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 5

Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ma come fare passo dopo passo? ..... oggetti grafici (cosa sono e come metterli), mettere etichette di dati sul grafico (dove inserire e con quali dati) ...... scusate le domande stupide.
Software.
Dovete scrivere un indicatore informativo con i dati che volete.
Poi, se RSI ha attraversato il livello 20 minuti fa, controlliamo il prezzo, cioè per andare short il prezzo deve essere più basso di 20 minuti fa. Grazie mille. Se funziona, ti devo una promessa))
Dato che lo creiamo al massimo vicino a MQL5, non useremo le funzioni MQL4 per ottenere lo spostamento delle barre in base al tempo e il prezzo di chiusura (iBarShift() e iClose() rispettivamente).
Abbiamo le nostre funzioni per questo: GetBarShift() e GetPriceClose(). Inoltre, dovremo ottenere l'ora della barra usando la funzione GetTime() invece di iTime(), dato che rifiutiamo le funzioni standard MQL4.
Ecco un Expert Advisor di prova:
//| 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);
}
//+------------------------------------------------------------------+
Ora dobbiamo fare una funzione separata per ricevere i dati RSI per il tempo richiesto e confrontare i prezzi e i valori RSI
Dato che lo creiamo al massimo vicino a MQL5, non useremo le funzioni MQL4 per ottenere lo spostamento delle barre in base al tempo e il prezzo di chiusura (iBarShift() e iClose() rispettivamente).
Abbiamo le nostre funzioni per questo: GetBarShift() e GetPriceClose(). Inoltre, dovremo ottenere l'ora della barra usando la funzione GetTime() invece di iTime(), dato che rifiutiamo le funzioni standard MQL4.
Ecco un Expert Advisor di prova:
//| 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);
}
//+------------------------------------------------------------------+
Ora dobbiamo fare una funzione separata per ottenere dati per RSI dal tempo desiderato e confrontare i prezzi e i valori RSI
{
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);
}
L'ho messo alla fine del codice per controllare:
{
int ticket;
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_SELL, 1, Bid, 0, 0, 0, NULL, 1234, 0, Red);
}
return(0);
}
Chi vi impedisce di visualizzare il codice di errore?
Chi ti impedisce di visualizzare il codice di errore?
Cari utenti del forum, ecco la domanda:
È possibile in un blocco di spunta
int start() {}
Creare un evento che, quando viene eseguito, mostrerà una finestra pop-up in cui è possibile impostare manualmente il valore di una variabile.
Questo è simile a ciò che accade quando si imposta una variabile tramite Extern, ma automaticamente durante l'esecuzione del programma, piuttosto che una volta all'avvio.
Vi sarei grato se poteste almeno dirmi da che parte scavare.
Grazie!
Cari utenti del forum, ecco la domanda:
È possibile in un blocco di spunta
int start() {}
Creare un evento che, quando viene eseguito, mostrerà una finestra pop-up in cui è possibile impostare manualmente il valore di una variabile.
Questo è simile a ciò che accade quando si imposta una variabile tramite Extern, ma automaticamente durante l'esecuzione del programma, piuttosto che una volta all'avvio.
Vi sarei grato se poteste almeno dirmi da che parte scavare.
Grazie!
Cari utenti del forum, ecco la domanda:
È possibile in un blocco di spunta
int start() {}
Creare un evento che, quando viene eseguito, mostrerà una finestra pop-up in cui è possibile impostare manualmente il valore di una variabile.
Questo è simile a ciò che accade quando si imposta una variabile con Extern, ma automaticamente durante l'esecuzione del programma piuttosto che una volta all'avvio.
Vi sarò grato se mi direte almeno in che direzione scavare.
Grazie!
Scava verso gli oggetti grafici. Il campo di input in particolare è OBJ_EDIT.
Ecco una funzione per crearla su un grafico:
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);
}
//+------------------------------------------------------------------+