#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()
}
パーセンテージの追加チェックを行う。
どの段階で、何をどのような割合で?
これをstart()に記述します。
というのも、init()では動作しないためです。
は、Point(?)をチェックしてみてはいかがでしょうか。
どうなることやら...。
どの段階で、何をどのような割合で?
これをstart()に記述します。
というのも、init()では動作しないためです。
は、Point(?)をチェックしてみてはいかがでしょうか。
どうなることやら...。
同じExpert Advisorを4つのWindowsで動かしているので、print()にDigits with Pointを入れたら、以下のような画像になりました。
つまり、3つのウィンドウは5桁で、1つのウィンドウは4桁 なので、不具合と言えます。
窓を全部閉めて、また開けて、5桁の数字を書いたアドバイザーをあちこちに置いて......。
窓を開けたら、証券会社に騙された気分です。
質問は終了しました...
Expert Advisor で指標値を取得するために、プログラムによって可能な TF を列挙し、最適化する可能性について質問されました。これは次のような方法で可能です - たとえば
この操作を行うファイルのExpert Advisorのコードスニペットを以下に示します。すべてそこにコメント付きで記述されています。
もしかしたら、誰かが役に立つかもしれません。
ありがとうございました。これまでTFの値を手動で変更してきた(最適化は長いプロセスであり、各TFの結果は別々に分析される)。
そして、ここでまた、助けてくれる皆さんに質問です。非標準のフラクタルとMAのブレーク後の任意のキャンドルから潜在的な信号の決定のためのバリアント用のコード(そのようなデザインで、私はブレーク後に必要なろうそくの数を決定することができます)。しかし......!?最適化が進まない...(( 1つのパラメータPeriod_MAを 1年間で3から5まで最適化を設定すると、数分以上進みます。2から240に設定すれば、コンピュータのことを忘れることができる・・・・。がフリーズしてしまい、時間が表示されない...。SL、TP、MODE、PRICE_TYPEといった残りのパラメータを最適化に含めるという話でもない。どうか、よろしければ、コードのどこがおかしいのか、教えてください......?なぜ最適化がうまくいかないのか?コードが動作することを確認できます。以下は、コードそのものです。
ここに全部は載せられないので、また追加します。
何が問題なのか、誰が知っているのか教えてください......?
ここで :
そして、エンディングは.
スベトニキとスクリプトをどこにどう挿入するのか?
https://docs.mql4.com/ru/ 保存されているものが書き込まれるディレクトリー
https://docs.mql4.com/ru/ 保存されているものが書き込まれるディレクトリー
シーピー