Capisco, grazie. Qualcun altro ha dei suggerimenti?
Anch'io ho imparato con te.
//+------------------------------------------------------------------+//| Demo_iBands.mq5 |//| Copyright 2021, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2021, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"//--- входные параметрыinputint bands_period=20; // период скользящей среднейinputint bands_shift=0; // сдвигinputdouble deviation=2.0; // кол-во стандартных отклоненийinputENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // тип цены//--- переменная для хранения хэндла индикатора iBandsint handle;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- создадим хэндл индикатора
handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндлif(handle==INVALID_HANDLE)
{
//--- сообщим о неудаче и выведем номер ошибкиPrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",
_Symbol,
EnumToString(_Period),
GetLastError());
//--- работа индикатора завершается досрочноreturn(INIT_FAILED);
}
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(handle!=INVALID_HANDLE)
IndicatorRelease(handle);
//--- почистим график при удалении индикатораComment("");
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//--- индикаторные буферыdouble UpperBuffer[];
double LowerBuffer[];
double MiddleBuffer[];
//--- количество копируемых значений из индикатора iBandsint values_to_copy=2;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работуif(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
return;
//--- сформируем сообщениеPrint("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0], "values_to_copy =",values_to_copy);
}
//+------------------------------------------------------------------+//| Заполняем индикаторные буферы из индикатора iBands |//+------------------------------------------------------------------+bool FillArraysFromBuffers(double &base_values[], // индикаторный буфер средней линии Bollinger Bandsdouble &upper_values[], // индикаторный буфер верхней границыdouble &lower_values[], // индикаторный буфер нижней границыint shift, // смещениеint ind_handle, // хэндл индикатора iBandsint amount // количество копируемых значений
)
{
//--- сбросим код ошибкиResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
{
//--- если копирование не удалось, сообщим код ошибкиPrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
//--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитаннымreturn(false);
}
//--- все получилосьreturn(true);
}
//+------------------------------------------------------------------+
Ragazzi, chi non è occupato e può guardare. abbozzato un EA sull'indicatore di ieri, ma qualcosa non funziona bene. Sembra che apra dei trade non basati su segnali. Ho provato ad aggiungere ordini di chiusura sul segnale opposto ma le operazioni vengono chiuse e poi no. Ho un'idea se c'è un errore nella condizione.
inputint Magic = 000;
inputdouble Lots = 0.1;
inputint TakeProfit = 100;
inputint StopLoss = 50;
inputint Slippage = 5;
double vverh,vnuz,SL,TP;
int tiket;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---/* if (Digits == 3 || Digits == 5)
{
TakeProfit *=10;
StopLoss *=10;
Slippage *=10;
}*///---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
vverh = iCustom(NULL,0,"777",0,1); // стрелка вверх
vnuz = iCustom(NULL,0,"777",1,1); // стрелка вниз//-----------------------------------------------------------if (CountSell() == 0 && vnuz >0)
{
tiket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
if (tiket>0)
{
SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
if (OrderSelect(tiket, SELECT_BY_TICKET))
if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
Print("Ошибка модификации ордера на продажу");
} elsePrint("Ошибка открытия ордера на продажу");
}
////////////////////////////////////////////////////////////////if (CountBuy() == 0 && vverh >0)
{
tiket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
if (tiket>0)
{
TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
if (OrderSelect(tiket, SELECT_BY_TICKET))
if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
Print("Ошибка модификации ордера на покупку");
} elsePrint("Ошибка открытия ордера на покупку");
}
}
//+------------------------------------------------------------------+int CountSell()
{
int count =0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+int CountBuy()
{
int count =0;
for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
count++;
}
}
return(count);
}
jarikn: Ragazzi, chi non è occupato e può guardare. abbozzato un EA sull'indicatore di ieri, ma qualcosa non funziona bene. Sembra che apra dei trade non basati su segnali. Ho provato ad aggiungere ordini di chiusura sul segnale opposto ma le operazioni vengono chiuse e poi no. Credo che mi manchi.
Molto probabilmente, l'indicatore disegna ... e cerca gli errori nel log
Capisco, grazie. Qualcun altro ha dei suggerimenti?
Anch'io ho imparato con te.
Basta non essere sorpresi quando smette di funzionareo funzionaa intermittenza.
Per quale motivo? Perché non scrivi cosa c'è che non va?
Per quale motivo? Perché non dici cosa c'è che non va?
Cosa sono tutte queste molestie?
Come mai l'omissione di soccorso?
Capisco.
Qualcun altro può dirmi cosa c'è di sbagliato lì, e per quale motivo smetterà di funzionare se c'è davvero qualcosa di sbagliato?
Capisco.
Forse qualcun altro può dirmi cosa c'è di sbagliato lì, e qual è la ragione per cui smette di funzionare se c'è davvero qualcosa di sbagliato?
Forum sul trading, sistemi di trading automatico e test di strategia
Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione di algoritmi e codici
Igor Makanu, 2021.07.05 14:16.
perché l'indicatore non è ancora calcolato.
https://www.mql5.com/ru/docs/series/barscalculated
la sezione OnInit() non è il posto migliore per ottenere l'ambiente terminale, penso che funzioni logicamente e correttamenteEcco la risposta.
Grazie.
Ho bisogno che faccia i calcoli della storia immediatamente all'avvio. Lo faccio nell'inite perché mi serve così.
Ho aggiunto una pausa nell'init, prima dei calcoli. Se è così, ci sono ancora delle insidie?
È necessario fare i calcoli sulla storia all'avvio. Lo faccio nell'inite perché mi serve così.
Ho aggiunto una pausa nell'inite, prima dei calcoli. Se è così, ci sono ancora delle insidie?
È più facile e più affidabile mettere il primo flag di avvio in OnTick()
Ragazzi, chi non è occupato e può guardare. abbozzato un EA sull'indicatore di ieri, ma qualcosa non funziona bene. Sembra che apra dei trade non basati su segnali. Ho provato ad aggiungere ordini di chiusura sul segnale opposto ma le operazioni vengono chiuse e poi no. Credo che mi manchi.
Per quale motivo? Perché non scrivi cosa c'è che non va?
Perché gli sviluppatori hanno scritto che OnInit() è destinato all'inizializzazione, non a qualcos'altro
Cosa succederà - hai fatto una pausa per ottenere i valori dell'indicatore in OnInit() - cosa succederà se l'utente cambia il TF allo stesso tempo?
SZZY: E come si comporterebbe il tuo codice se esegui un EA, poi chiudi il terminale e riapri il terminale con un EA in esecuzione?