[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 28
Hai chiesto la possibilità di enumerare programmaticamente e ottimizzare i possibili TF per ottenere i loro valori di indicatore nell'Expert Advisor. Questo è possibile nel seguente modo - per esempio
Qui ci sono alcuni frammenti di codice dell'Expert Advisor nel file dove viene eseguita questa operazione - tutto è descritto lì con dei commenti.
Forse qualcun altro può trovarlo utile.
Grazie! Ho cambiato i valori TF manualmente finora (l'ottimizzazione è lunga e l'analisi per ogni TF è fatta separatamente).
Ed ecco un'altra domanda per tutti coloro che possono aiutare. Il codice per le varianti di frattale non standard e per la definizione di potenziali segnali da qualsiasi candela dopo la rottura della MA (a tale disegno posso definire il numero di candele di cui ho bisogno dopo la rottura) Ma....! L'ottimizzazione non "vuole" andare...(( Se imposto l'ottimizzazione per un solo parametro Period_MA da 3 a 5 in un anno, ci vuole più di qualche minuto. Se imposto da 2 a 240, posso dimenticare il computer ..... si blocca e non ti dà alcuna indicazione di quanto tempo ci vuole... Non sto nemmeno parlando di includere il resto dei parametri - SL, TP, MODE, PRICE_TYPE - nell'ottimizzazione. Per favore, ditemi, se posso, cosa c'è di sbagliato nel codice...? Perché l'ottimizzazione non va bene? Il codice funziona - potete controllarlo. Ecco il codice stesso:
#include <stdlib.mqh>externint Period_MA = 5, // Период расчётной МА
ПрибыльФр=10, // Не меньше 4
HФр = 1, // Фильтр над фракталом
Ограничение=52,
PERIOD=1, // Период текущего графика (таймфрейм)
MODE=3, // Метод усреднения из методов скользящего среднего
PRICE_TYPE=0; // Используемая цена из ценовых константbool Fact_вверх = false, // Движения вверх нет
Fact_вниз = false, // Движения вниз нет
Buy = false, // Инициализация buystop
Sell = false,
ПервФрвверх=false,
ПервФрвниз=false;
color вверх = SpringGreen, // Цвет сделки вверх
вниз = Red, // Цвет сделки вниз
отмена = Yellow, // Цвет отмены сделки
Свеча1 C=Blue; // Цвет номера 1С свечиint ticketup, // Ордер вверх
ticketdown, // Ордер вниз
BarTime, // Время текущего бара
Tвверх, // Время сделки вверх
Tвниз, // Время сделки вниз
A, // Переменная массива вверх
B; // Переменная массива внизdouble SL,
TP,
PointX;
int init()
{
if(Digits==5 || Digits==3) PointX = Point * 10; // Корректировка Point под трёх- пятизнакif(Digits==4 || Digits==2) PointX = Point;
return(0);
}
//--------------------------------------------------------------------int start() // Спец. функция start
{
double MAC1, // Значение МА на n баре
MAC2, // Значение МА на следующей свече
Разность,
Lot=0.01; // Лотstring Symb=Symbol(), // Финанс. инструмент
С1 = "C1", // Текст для обозначения ордера
Пусто = " "; // Текст для обозначения ордераint n=1, // Номер свечи, с которой начинается проверка
Фр;
bool Движ_вниз = false,
Движ_вверх = false;
if(BarTime!=Time[0]) // Условие для того, чтобы программа считала только на начале бара, а не на каждом тике
{
//--------------------------------------------------------------------while(true) // Цикл по перебору свечей вверх до изгиба МА Синей
{
// Обращение к функции техн.инд. MA
MAC1 = iMA(Symbol(),PERIOD,Period_MA,0,MODE,PRICE_TYPE,n); // Первая сравниваемая свеча
n++; // Переход на следующую свечу
MAC2 = iMA(Symbol(),PERIOD,Period_MA,0,MODE,PRICE_TYPE,n); // Последующая сравниваемая свеча
Разность = (MAC1 - MAC2)/PointX; // Разница МА между соседними свечами//--------------------------------------------------------------------if (NormalizeDouble(Разность,Digits) >= 1 ) // Условие движения вверх
{
Движ_вверх = true;
Движ_вниз = false;
ПервФрвниз=false;
}
if(NormalizeDouble(Разность,Digits)<-1) // Выход на противоположное движение break; // Выход из цикла while (перебора свечей)
} // Конец цикла while (перебора свечей)//--------------------------------------------------------------------if (Движ_вверх == true)
{
Print("Движ_вверх");
int Количество = OrdersTotal(); // Количество ордеров на данный момент for(int i=Количество-1; i>=0;i--) // Цикл перебора ордер
{
if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий
{
int Tip=OrderType(); // Определения типа ордера//-------------------------------------------------------------------- switch(Tip) // Переключатель на типы ордеров
{
case5: int N = OrderTicket(); // Метка удаляемого ордера SELLSTOP
Закрыть(N); // Вызов функции удаления отложенного ордераcontinue;
}
}
}
for(i=2;i<=n-2;i++)
{
if(NormalizeDouble(High[i],Digits)>NormalizeDouble(High[i+1],Digits)
&& NormalizeDouble(High[i],Digits)>NormalizeDouble(High[i-1],Digits))
{
if(ПервФрвверх==false)
{
ПервФрвверх=true;
Фр=i;
}else
{
Фр=i;
}
}
if(NormalizeDouble(High[i],Digits)==NormalizeDouble(High[i+1],Digits)
&& NormalizeDouble(High[i],Digits)>NormalizeDouble(High[i+2],Digits)
&& NormalizeDouble(High[i],Digits)>NormalizeDouble(High[i-1],Digits))
{
if(ПервФрвверх==false)
{
ПервФрвверх=true;
Фр=i;
}else
{
Фр=i;
}
}
}
if (ПервФрвверх==true)
{
A++;
Print("n = ",n);
double ОткрФрвверх=High[Фр]+HФр*PointX;
SL=Bid-Ограничение*PointX;
TP=Bid+ПрибыльФр*PointX; // Заявленная цена TPint Ind_max =ArrayMaximum(High,n,0); // Индекс бара макс.ц. double max = High[Ind_max]; // Искомая макс ценаint Min_Dist=MarketInfo(Symbol(),MODE_STOPLEVEL); // Мин. дистанцияint Время_фрактала=Time[Фр];
double Цена_рисунка=Open[Фр];
if (Tвверх!=Time[Фр]) // Если цена ещё не достигла ТP(при включении сов.)
{
Tвверх=Time[Фр]; // Определение времени для этого условия открытияwhile(true) // Цикл открытия орд.
{
ticketup=OrderSend(Symb, OP_BUY, Lot, Ask,0, SL, TP,NULL,A,0,вверх); // Ордер вверхint Error=GetLastError();
Print("Error = ",Error);
switch(Error) // Преодолимые ошибки
{
case6: Alert("Нет связи с торговым сервером. Пробуем ещё раз..");
RefreshRates(); // Обновим данныеSleep(1); // Задержка в цикле до нового тикаcontinue; // На след. итерацию
}
break; // Выход из цикла
}
}
}
}
//*********************************************************************************************************
n=1;
while(true) // Цикл по перебору свечей вниз до изгиба МА Синей
{
// Обращение к функции техн.инд.
MAC1 = iMA(Symbol(),PERIOD,Period_MA,0,MODE,PRICE_TYPE,n); // Первая сравниваемая свеча
n++; // Переход на следующую свечу
MAC2 = iMA(Symbol(),PERIOD,Period_MA,0,MODE,PRICE_TYPE,n); // Последующая сравниваемая свеча
Разность = (MAC1 - MAC2)/PointX; // Разница МА между соседними свечами//--------------------------------------------------------------------if (NormalizeDouble(Разность,Digits) <= -1 ) // Условие движения вниз
{
Движ_вниз = true;
Движ_вверх = false;
ПервФрвверх=false;
continue;
}
if(NormalizeDouble(Разность,Digits)>1) // Выход на противоположное движение break; //Выход из цикла while (перебора свечей)
} //Конец цикла while (перебора свечей)//-------------------------------------------------------------------- if (Движ_вниз == true)
{
Print("Движ_вниз");
Количество = OrdersTotal(); // Количество ордеров на данный момент for(i=Количество-1; i>=0;i--) // Цикл перебора ордер
{
if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий
{
Tip=OrderType(); // Определения типа ордера//-------------------------------------------------------------------- switch(Tip) // Переключатель на типы ордеров
{
case4: N = OrderTicket(); // Метка удаляемого ордера BUYSTOP
Закрыть(N); // Вызов функции удаления отложенного ордераcontinue;
}
}
}
for(i=2;i<=n-2;i++)
{
if(NormalizeDouble(Low[i],Digits)<NormalizeDouble(Low[i+1],Digits)
&& NormalizeDouble(Low[i],Digits)<NormalizeDouble(Low[i-1],Digits))
{
if(ПервФрвниз==false)
{
ПервФрвниз=true;
Фр=i;
}else
{
Фр=i;
}
}
if(NormalizeDouble(Low[i],Digits)==NormalizeDouble(Low[i+1],Digits)
&& NormalizeDouble(Low[i],Digits)<NormalizeDouble(Low[i+2],Digits)
&& NormalizeDouble(Low[i],Digits)<NormalizeDouble(Low[i-1],Digits))
{
if(ПервФрвниз==false)
{
ПервФрвниз=true;
Фр=i;
}else
{
Фр=i;
}
}
}
if (ПервФрвниз==true)
{
B++;
Print("n = ",n);
double ОткрФрвниз=Low[Фр]-HФр*PointX;
SL=Bid+Ограничение*PointX-3*PointX;
TP=Bid-ПрибыльФр*PointX-3*PointX; // Заявленная цена TPint Ind_min =ArrayMinimum(Low,n,0); // Индекс бара мин.ц. double min = Low[Ind_min]; // Искомая мин цена
Время_фрактала=Time[Фр];
Цена_рисунка=Open[Фр];
if (Tвниз!=Time[Фр]) // Если цена ещё не достигла ТP(при включении сов.)
{
Tвниз=Time[Фр]; // Определение времени для этого условия открытияwhile(true) // Цикл открытия орд.
{
Alert("Bid = ",Bid);
ticketdown=OrderSend(Symb, OP_SELL, Lot, Bid,0, SL,TP,NULL,B,0,вниз); // Ордер вверх
Error=GetLastError();
Print("Error = ",Error);
switch(Error) // Преодолимые ошибки
{
case6: Alert("Нет связи с торговым сервером. Пробуем ещё раз..");
RefreshRates(); // Обновим данныеSleep(1); // Задержка в цикле до нового тикаcontinue; // На след. итерацию
}
break; // Выход из цикла
}
}
}
}
BarTime=Time[0];
}
return(0); // Выход из start()
}
Fai un controllo extra per la percentuale.
in quale fase e il rapporto tra cosa e cosa?
mettere questo in start()
perché non funzionerà in init(),
forse controllare Point (?
Vedrò cosa succede...
in quale fase e il rapporto tra cosa e cosa?
mettere questo in start()
perché non funzionerà in init(),
forse controllare Point(?
Vedrò cosa succede...
Ho messo Cifre con Punto in print() dato che ho lo stesso Expert Advisor in esecuzione su quattro finestre, ho ottenuto la seguente immagine:
Cioè, tre finestre hanno cinque cifre e una finestra ne ha quattro, quindi è un problema tecnico,
Ho chiuso tutte le finestre, le ho riaperte, ho messo consiglieri ovunque con cinque cifre...
Mi sento come se la mia società di intermediazione avesse imbrogliato quando ho aperto le finestre,
La questione è chiusa...
Hai chiesto la possibilità di enumerare programmaticamente e ottimizzare i possibili TF per ottenere i loro valori di indicatore nell'Expert Advisor. Questo è possibile nel seguente modo - per esempio
Qui ci sono alcuni frammenti di codice dell'Expert Advisor nel file dove viene eseguita questa operazione - tutto è descritto lì con dei commenti.
Forse qualcun altro può trovarlo utile.
Grazie! Ho cambiato i valori TF manualmente finora (l'ottimizzazione è lunga e l'analisi per ogni TF è fatta separatamente).
Ed ecco un'altra domanda per tutti coloro che possono aiutare. Il codice per le varianti di frattale non standard e per la definizione di potenziali segnali da qualsiasi candela dopo la rottura della MA (a tale disegno posso definire il numero di candele di cui ho bisogno dopo la rottura) Ma....! L'ottimizzazione non "vuole" andare...(( Se imposto l'ottimizzazione per un solo parametro Period_MA da 3 a 5 in un anno, ci vuole più di qualche minuto. Se imposto da 2 a 240, posso dimenticare il computer ..... si blocca e non ti dà alcuna indicazione di quanto tempo ci vuole... Non sto nemmeno parlando di includere il resto dei parametri - SL, TP, MODE, PRICE_TYPE - nell'ottimizzazione. Per favore, ditemi, se posso, cosa c'è di sbagliato nel codice...? Perché l'ottimizzazione non va bene? Il codice funziona - potete controllarlo. Ecco il codice stesso:
Non posso mettere tutto qui, ne aggiungerò altri.
Qual è il problema, puoi dirmi chi lo sa...?
Qui:
E il finale:
come o dove si inseriscono gli svetniki e gli script?
https://docs.mql4.com/ru/ le directory in cui viene scritto ciò che viene memorizzato
https://docs.mql4.com/ru/ le directory in cui viene scritto ciò che viene memorizzato
cp