Buona giornata a tutti. Puoi per favore avvisare se la funzione Sleep() viene eseguita nella modalità di test dell'Expert Advisor (test su tick reali, ovviamente)?
SuhanovDM94 #: Buona giornata a tutti. Potresti per favore avvisare se Sleep() viene eseguito nella modalità di test dell'Expert Advisor (test su tick reali, ovviamente)?
In corso - il tempo del Tester è cambiato di una quantità appropriata.
Si scopre che è possibile. Il ciclo for è inserito in una funzione separata, nella funzione OnTick() o a vostra discrezione. Mi interessa l'opinione degli altri. Per esempio, ne ho bisogno per creare un sistema ultra-preciso. Pertanto, sto scrivendo senza librerie, comprese le funzioni di apertura e chiusura delle posizioni. Chi dice cosa, le librerie mqh rallentano il lavoro, per esempio la compilazione impiega 1,5 volte di più. È meglio scrivere tutto in un file. Lo stile, OOP o procedurale, non ha importanza. MQL5 non diventerà mai un linguaggio al livello del C++, è limitato. Il punto è nelle biblioteche.
#define EXPERT_MAGIC 261// MagicNumber экспертаinputstring Symbol_T = "XAUUSD"; // глобальная переменная для задаваемого символа
..............
for(int i = PositionsTotal()-1; i >= 0; i--)
{
if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == Symbol_T && PositionGetInteger(POSITION_MAGIC) == EXPERT_MAGIC)
{
int attempts = 0; // счетчик попытокbool success = false; // флаг успешного выполнения копирования тиковMqlTick tick_array[]; // массив для приема тиков//--- сделаем 3 попытки получить тикиwhile(attempts < 3)
{
//--- замерим время старта перед получением тиковuint start = GetTickCount();
//--- дата, по которую запрашиваются тики (время открытия позиции)datetime Time_Open = (datetime)PositionGetInteger(POSITION_TIME);
//--- дата, с которой запрашиваются тики (достаточно взять на 30 секунд раньше открытия позиции)datetime Time_Start = (datetime)(Time_Open-30);
//--- запросим тиковую историю с момента Time_Start до момента Time_Openint received = CopyTicksRange(Symbol_T, tick_array, COPY_TICKS_ALL, Time_Start*1000, Time_Open*1000);
if(received != -1)
{
//--- выведем информацию о количестве тиков и затраченном времениPrintFormat("%s: received %d ticks in %d ms", Symbol_T, received, GetTickCount()-start);
//--- если тиковая история синхронизирована, то код ошибки равен нулюif(GetLastError()==0)
{
success = true;
break;
}
elsePrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d", Symbol_T, received, GetTickCount()-start, _LastError);
}
//--- считаем попытки
attempts++;
//--- пауза в 1 секунду в ожидании завершения синхронизации тиковой базыSleep(1000);
}
//--- не удалось получить запрошенные тики от самого начала истории с трех попыток if(!success)
{
PrintFormat("Ошибка! Не удалось получить %d тиков по %s с трех попыток", Symbol_T);
//return; (вставить, если цикл находится внутри функции типа void)
}
//--- узнаем количесто элементов в массивеint ticks = ArraySize(tick_array);
//--- выведем bid последнего тика в массиве перед самым открытием позицииdouble last_bid_before_priceopen = tick_array[ticks-1].bid;
Print("BID последнего тика: ", tick_array[ticks-1].bid);
//--- выведем ask последнего тика в массиве перед самым открытием позицииdouble last_ask_before_priceopen = tick_array[ticks-1].ask;
Print("ASK последнего тика: ", tick_array[ticks-1].ask);
//--- узнаем цену, по которой была открыта позицияdouble Position_PriceOpen = PositionGetDouble(POSITION_PRICE_OPEN);
if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
//--- вычислим размер последнего тика, на котором была открыта позиция (для BUY позиции открытие было по цене ASK)double size_last_tick_ASK = NormalizeDouble(fabs(Position_PriceOpen - last_ask_before_priceopen), _Digits);
}
elseif((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
//--- вычислим размер последнего тика, на котором была открыта позиция (для SELL позиции открытие было по цене BID)double size_last_tick_BID = NormalizeDouble(fabs(last_bid_before_priceopen - Position_PriceOpen), _Digits);
}
}
}
Sono stufo di questo bug - c'è un indicatore, c'è un esperto che ci sta lavorando. Cambio l'indicatore e lo ricompilo. I cambiamenti dell'indicatore si vedono chiaramente sul grafico - l'Expert Advisor viene eseguito nel tester - ma è come se non avesse cambiato nulla. Lo stesso risultato.
Se riavvio il terminale e passo il tester dopo di che genera un nuovo codice.
Cos'è questo hack, non capisco.
Ho rimosso l'indicatore ex5. Il tester continua a funzionare come se non fosse successo nulla. Dove prende il file da eseguire????
Ma ora l'indicatore buffer IndBuff[i] sta facendo il cervello, array fuori portata. Di cosa ha bisogno? Perché non si alloca a i=limite iniziale?
//Проверка и расчёт количества просчитываемых баровint limit = rates_total-prev_calculated;
if(limit==1)
limit=2;
//-------------------------------------------------------------------------//Расчёт индикатораfor(int i=limit-1; i>=0; i--)
{
c = iClose(_Symbol,PERIOD_CURRENT,i);
IndBuff[i] = c; //на этой строке array out of range
}
Questo perché IndBuff non è assegnato a rates_total + 1 E ArrayResize non è applicabile ad esso. Hanno rotto il per costruire. Ora dobbiamo usare gli if-ars per fare tutto?
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate (constint rates_total,
constint prev_calculated,
constint begin,
constdouble& price[])
{
ArraySetAsSeries(IndBuff, true);
//-------------------------------------------------------------------------//Проверка и расчёт количества просчитываемых баровint limit = rates_total-prev_calculated;
if(limit > 1)
{
Print(rates_total,": rates_total");
Print(limit,": limit");
Print(ArraySize(IndBuff),": IndBuff");
}
//-------------------------------------------------------------------------//Расчёт индикатораfor(int i=limit; i>=0; i--)
{
c = iClose(_Symbol,PERIOD_CURRENT,i);
IndBuff[i] = c; //array out of range
}
return(rates_total);
}
100686: rates_total
100686: limit
100686: IndBuff
array out of range in 'Simple.mq5' (82,15)
Buona giornata a tutti. Potresti per favore avvisare se Sleep() viene eseguito nella modalità di test dell'Expert Advisor (test su tick reali, ovviamente)?
In corso - il tempo del Tester è cambiato di una quantità appropriata.
Eseguito - il tempo del Tester viene cambiato di una quantità appropriata.
Grazie mille!
È possibile trovare la dimensione del tick stesso in mql5, dopo il quale è stata aperta una posizione?
Si scopre che è possibile. Il ciclo for è inserito in una funzione separata, nella funzione OnTick() o a vostra discrezione. Mi interessa l'opinione degli altri. Per esempio, ne ho bisogno per creare un sistema ultra-preciso. Pertanto, sto scrivendo senza librerie, comprese le funzioni di apertura e chiusura delle posizioni. Chi dice cosa, le librerie mqh rallentano il lavoro, per esempio la compilazione impiega 1,5 volte di più. È meglio scrivere tutto in un file. Lo stile, OOP o procedurale, non ha importanza. MQL5 non diventerà mai un linguaggio al livello del C++, è limitato. Il punto è nelle biblioteche.
Sono stufo di questo bug - c'è un indicatore, c'è un esperto che ci sta lavorando. Cambio l'indicatore e lo ricompilo. I cambiamenti dell'indicatore si vedono chiaramente sul grafico - l'Expert Advisor viene eseguito nel tester - ma è come se non avesse cambiato nulla. Lo stesso risultato.
Se riavvio il terminale e passo il tester dopo di che genera un nuovo codice.
Cos'è questo hack, non capisco.
Ho rimosso l'indicatore ex5. Il tester continua a funzionare come se non fosse successo nulla. Dove prende il file da eseguire????
3184
Strano comportamento nell'indicatore.
Il ciclo for va nel corpo, non su ogni tick, ma solo una volta su una nuova candela.
Ma i == 0 e la condizione data permette i>=0
sul tick della stessa barra limit = 0
quindi il primo valore di i = -1 e la condizione i>=0
ecco perché non va in loop.
al tick della stessa barra limit = 0
quindi il primo valore i = -1 e la condizione i>=0
ecco perché non va in loop.
Grazie, mi mancava quello.
Ma ora l'indicatore buffer IndBuff[i] sta facendo la sua testa, array fuori portata.
Di cosa ha bisogno? Perché non alloca a i=limite iniziale?
Grazie, l'ho perso.
Ma ora l'indicatore buffer IndBuff[i] sta facendo il cervello, array fuori portata.
Di cosa ha bisogno? Perché non si alloca a i=limite iniziale?
Così su ogni barra va in un ciclo, mentre ha bisogno di andare in un ciclo su ogni tick.
Funzionava così
per i tick i>=0,
per le barre i>0
Ora non so come lavorare con il buffer.
Questo perché IndBuff non è assegnato a rates_total + 1
E ArrayResize non è applicabile ad esso.
Hanno rotto il per costruire. Ora dobbiamo usare gli if-ars per fare tutto?