В учебнике Сергея Ковалева нашел эксперта - трейлинг стоп. Скопировал его в MetaEditor, скомпилировал, но программа не работает. Пожалуйста, подскажите в чем причина. Может я что-то не так делаю.
//--------------------------------------------------------------------
// modifystoploss.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int Tral_Stop=10; // Дист. преследования
//--------------------------------------------------------------- 1 --
int start() // Спец. функция start
{
string Symb=Symbol(); // Финанс. инструмент
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
//------------------------------------------------------ 3 --
while(true) // Цикл модификации
{
double TS=Tral_Stop; // Исходное значение
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист
if (TS<Min_Dist) // Если меньше допуст.
TS=Min_Dist; // Новое значение TS
//--------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (NormalizeDouble(SL,Digits)< // Если ниже желаем.
NormalizeDouble(Bid-TS*Point,Digits))
{
SL=Bid-TS*Point; // то модифицируем его
string Text="Buy "; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (NormalizeDouble(SL,Digits)> // Если выше желаем.
NormalizeDouble(Ask+TS*Point,Digits)
|| NormalizeDouble(SL,Digits)==0)//или равно нулю
{
SL=Ask+TS*Point; // то модифицируем его
Text="Sell "; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
double TP =OrderTakeProfit(); // TP выбранного орд.
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
Alert ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
Alert ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
//--------------------------------------------------- 7 --
int Error=GetLastError(); // Не получилось :(
switch(Error) // Преодолимые ошибки
{
case 130:Alert("Неправильные стопы. Пробуем ещё раз.");
RefreshRates(); // Обновим данные
continue; // На след. итерацию
case 136:Alert("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
continue; // На след. итерацию
case 146:Alert("Подсистема торгов занята.Пробуем ещё");
Sleep(500); // Простое решение
RefreshRates(); // Обновим данные
continue; // На след. итерацию
// Критические ошибки
case 2 : Alert("Общая ошибка.");
break; // Выход из switch
case 5 : Alert("Старая версия клиентского терминала.");
break; // Выход из switch
case 64: Alert("Счет заблокирован.");
break; // Выход из switch
case 133:Alert("Торговля запрещена");
break; // Выход из switch
default: Alert("Возникла ошибка ",Error);//Др. ошибки
}
break; // Из цикла модифи.
} // Конец цикла модифи.
//------------------------------------------------------ 8 --
} // Конец анализа орд.
} // Конец перебора орд.
//--------------------------------------------------------------- 9 --
return; // Выход из start()
}
//-------------------------------------------------------------- 10 --
В учебнике Сергея Ковалева нашел эксперта - трейлинг стоп. Скопировал его в MetaEditor, скомпилировал, но программа не работает. Пожалуйста, подскажите в чем причина. Может я что-то не так делаю.
Используйте вот это:
В пользовательских переменных пишем:
externstring с9="------ Трейлингстоп ------";
externint TrailingStop=20; //Трейлинг-Стоп рыночного ордера. Если = 0 или то тарла нетexternint TrailingStep=5; //Шаг трала рыночного ордераexternbool WaitProfit = true; // Если true, то ждать профит = значению TrailingStop и только потом начинать тралить//Иначе, трейлинговать не дожидаясь положительного профита
extern string с10=" -------- Прочие параметры -------------";
extern int MAGIC=123456;//У ордеров открытых вручную MAGIC=0
extern int Proskalz=10;//Проскальзывание
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Всем здрассте...
Будьте добры, подскажите как собрать путь к файлам истории MetaTrader 4? Такой, как например "c:\program files\metatrader 4\history\alpari-classic\"
Спасибо большое, sergeev, я кажысь, надыбал...
Print("Terminal path: ", TerminalPath() + "\\history\\" + AccountServer() + "\\");
эта строка выводит правильный путь несмотря на то что редактор в цветах ошибается... Нужно в блокноте наверное записывать код. Шутка.
Всем добрый вечер!
В учебнике Сергея Ковалева нашел эксперта - трейлинг стоп. Скопировал его в MetaEditor, скомпилировал, но программа не работает. Пожалуйста, подскажите в чем причина. Может я что-то не так делаю.
а он точно на mql написан?)
выкладывай код то
//-------------------------------------------------------------------- // modifystoploss.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- extern int Tral_Stop=10; // Дист. преследования //--------------------------------------------------------------- 1 -- int start() // Спец. функция start { string Symb=Symbol(); // Финанс. инструмент //--------------------------------------------------------------- 2 -- for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий { // Анализ ордеров: int Tip=OrderType(); // Тип ордера if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер double SL=OrderStopLoss(); // SL выбранного орд. //------------------------------------------------------ 3 -- while(true) // Цикл модификации { double TS=Tral_Stop; // Исходное значение int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Миним. дист if (TS<Min_Dist) // Если меньше допуст. TS=Min_Dist; // Новое значение TS //--------------------------------------------------- 4 -- bool Modify=false; // Не назначен к модифи switch(Tip) // По типу ордера { case 0 : // Ордер Buy if (NormalizeDouble(SL,Digits)< // Если ниже желаем. NormalizeDouble(Bid-TS*Point,Digits)) { SL=Bid-TS*Point; // то модифицируем его string Text="Buy "; // Текст для Buy Modify=true; // Назначен к модифи. } break; // Выход из switch case 1 : // Ордер Sell if (NormalizeDouble(SL,Digits)> // Если выше желаем. NormalizeDouble(Ask+TS*Point,Digits) || NormalizeDouble(SL,Digits)==0)//или равно нулю { SL=Ask+TS*Point; // то модифицируем его Text="Sell "; // Текст для Sell Modify=true; // Назначен к модифи. } } // Конец switch if (Modify==false) // Если его не модифи break; // Выход из while //--------------------------------------------------- 5 -- double TP =OrderTakeProfit(); // TP выбранного орд. double Price =OrderOpenPrice(); // Цена выбранн. орд. int Ticket=OrderTicket(); // Номер выбранн. орд. Alert ("Модификация ",Text,Ticket,". Ждём ответ.."); bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его! //--------------------------------------------------- 6 -- if (Ans==true) // Получилось :) { Alert ("Ордер ",Text,Ticket," модифицирован:)"); break; // Из цикла модифи. } //--------------------------------------------------- 7 -- int Error=GetLastError(); // Не получилось :( switch(Error) // Преодолимые ошибки { case 130:Alert("Неправильные стопы. Пробуем ещё раз."); RefreshRates(); // Обновим данные continue; // На след. итерацию case 136:Alert("Нет цен. Ждём новый тик.."); while(RefreshRates()==false) // До нового тика Sleep(1); // Задержка в цикле continue; // На след. итерацию case 146:Alert("Подсистема торгов занята.Пробуем ещё"); Sleep(500); // Простое решение RefreshRates(); // Обновим данные continue; // На след. итерацию // Критические ошибки case 2 : Alert("Общая ошибка."); break; // Выход из switch case 5 : Alert("Старая версия клиентского терминала."); break; // Выход из switch case 64: Alert("Счет заблокирован."); break; // Выход из switch case 133:Alert("Торговля запрещена"); break; // Выход из switch default: Alert("Возникла ошибка ",Error);//Др. ошибки } break; // Из цикла модифи. } // Конец цикла модифи. //------------------------------------------------------ 8 -- } // Конец анализа орд. } // Конец перебора орд. //--------------------------------------------------------------- 9 -- return; // Выход из start() } //-------------------------------------------------------------- 10 --Всем добрый вечер!
В учебнике Сергея Ковалева нашел эксперта - трейлинг стоп. Скопировал его в MetaEditor, скомпилировал, но программа не работает. Пожалуйста, подскажите в чем причина. Может я что-то не так делаю.
Используйте вот это:
В пользовательских переменных пишем:
В Старте советника пишем:
// ----------------------------- Тралим ордера ------------------------------------ TrailingRyn_b(TrailingStop,TrailingStep,Proskalz,MAGIC,WaitProfit,false);После старта в пользовательских подпрограммах пишем:
Функции типа ModifError() - это мои пользовательские функции - они просто выводят сообщение об ошибке. Напишите вместо них свои сообщения.
https://docs.mql4.com/ru/indicators/iBands