Вы спрашивали о возможности программно проводить перебор и оптимизацию возможных ТФ для получения с них значений индикаторов в эксперте. Это возможно следующим образом - для примера -
кускочки кода, в файле - эксперт из журнала, где подобная операция проведена - там все подробно расписано с комментариями
Может кому еще подобная инфа пригодится.
Спасибо ! Я пока вручную меняю значения ТФ (оптимизация идёт долго и анализ по результатам каждого ТФ - отдельно).
А вот ещё вопрос всем, кто может помочь. Код для вариантов нестандартного фрактала и для определения потенциальных сигналов с любой свечи после излома МА (при такой конструкции я могу определить номер нужной мне свечи после излома.) Но....! Оптимизация идти "не хочет"...(( Если ставлю оптимизацию только ОДНОГО параметра Period_МА от 3 до 5 за один год, то идёт больше нескольких минут. Если поставить от 2 до 240 - то о компе можно забыть .... там вообще зависает и не выдаёт, сколько нужно времени... Я уже не говорю о включении в оптимизацию остальных параметров - SL, TP, MODE, PRICE_TYPE. Подскажите, если можно, что не так в коде...? Почему не идёт оптимизация..? Код рабочий - можете проверить. Собственно и сам код:
#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, // Цвет отмены сделки
Свеча1C=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()
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Сделайте дополнительную проверку на процентное соотношение.
на каком этапе и соотношение чего к чему?
поставил вот это в start()
т.к. в init() не сработает,
может еще Point проверять?
посмотрю что даст...
на каком этапе и соотношение чего к чему?
поставил вот это в start()
т.к. в init() не сработает,
может еще Point проверять?
посмотрю что даст...
вставил Digits с Point в print(), т.к. у меня работает один и тот же советник на четырех окнах, получил такую картинку:
т.е. на трех окнах пятизнак, а на одном четырехзнак, вот такой глюк,
позакрывал все окна, заново открыл, поставил советники, везде пятизнак...
Похоже ДЦ что-то химичило когда я окна открывал,
Вопрос закрыт...
Вы спрашивали о возможности программно проводить перебор и оптимизацию возможных ТФ для получения с них значений индикаторов в эксперте. Это возможно следующим образом - для примера -
кускочки кода, в файле - эксперт из журнала, где подобная операция проведена - там все подробно расписано с комментариями
Может кому еще подобная инфа пригодится.
Спасибо ! Я пока вручную меняю значения ТФ (оптимизация идёт долго и анализ по результатам каждого ТФ - отдельно).
А вот ещё вопрос всем, кто может помочь. Код для вариантов нестандартного фрактала и для определения потенциальных сигналов с любой свечи после излома МА (при такой конструкции я могу определить номер нужной мне свечи после излома.) Но....! Оптимизация идти "не хочет"...(( Если ставлю оптимизацию только ОДНОГО параметра Period_МА от 3 до 5 за один год, то идёт больше нескольких минут. Если поставить от 2 до 240 - то о компе можно забыть .... там вообще зависает и не выдаёт, сколько нужно времени... Я уже не говорю о включении в оптимизацию остальных параметров - SL, TP, MODE, PRICE_TYPE. Подскажите, если можно, что не так в коде...? Почему не идёт оптимизация..? Код рабочий - можете проверить. Собственно и сам код:
Всё не влезло, добавлю дальше.
В чём загвоздка, может, подскажете, кто знает..?
Вот :
И окончание :
подскажите как или куда вставлять саветников и скрипты???
https://docs.mql4.com/ru/ написаны директории, где что хранится
https://docs.mql4.com/ru/ написаны директории, где что хранится
спс