Jump to content

помогите разобраться


zvagolskiy.ru

Recommended Posts

zvagolskiy.ru

Здравствуйте.Я самостоятельно пытаюсь изучать язык MQL 4,изучаю уже около 2 лет.Толковой информации очень мало.В интернете все как-то безсистемно,а я изучаю с самого нуля и все через интернет.Самое толковое это этот форум и учебник Ковалева.Но вот с горем пополам.Написал свой первый советник.Прошу строго не судить.Я только учусь.Проблема состоит в том,что при компиляции метаэдитор выдает две ошибки.Обе ошибки связаны со скобками.Советник находится в файле под этим сообщением.Подскажите,пожалуйста,где ошибки.И вообще,если Вам не трудно,подскажите,что можно исправить в советнике или сделать по другому.Поясню,что я при написании этого советника расчитывал сделать свой первый робот,который сможет торговать,то есть без всяких сложных дополнений.

 

Скрытый текст


#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int     Period_MA_1=12;                            //Период МА 1.
extern int     Period_MA_2=24;                            //Период МА 2.
extern int     StopLoss=30;
extern int     TakeProfit=100;
extern int     Magic=12345;
extern int     TrailingStop=50;
extern int     TrailingStep=10;

extern double  Rastvor=28.0;                             //Расстояние между МА 1 и МА 2,необходимое для открытия ордера.
extern double  Lots=0.1;                                 //Жестко заданное кол-во лотов.
extern double  Prots=3;                                  //Если параметр Lots=0,то размер лота выбираем в % от свободных средств.

bool Work=true;                                          //Если стоит параметр true,то эксперт работает.Если false,то нет.

string Symbol;                                             //Название фин.инструмента,на котором будет работать советник.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   double Min_Lot;                                        //Минимально разрешенный брокером размер лота.
   double Free;                                           //Сколько свободных средств на счете.
   double Step;                                           //Шаг изменения размера лота.
   double Lot;                                           //Размер лота,заданный пользователем. 
   double One_Lot;                                        //Стоимость одного лота.
    //БЛОК ПРЕДВАРИТЕЛЬНОЙ ОБРАБОТКИ.//
   {
  
   if(Bars < Period_MA_2)                                           //Проверяем наличие необходимого кол-ва баров.
    {
     Alert("Недостаточно баров в окне.Эксперт не работает.");
     return();                                                        //Выход из функции OnInit.Эксперт не работает.
    }
   if(Work == false)                                                //Критическая ошибка.
    {
     Alert("Критическая ошибка.Эксперт не работает.");
     return();                                                        //Выход из функции OnInit.Эксперт не работает.
     }

   return(INIT_SUCCEEDED);

  
  
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
                    //ТОРГОВЫЕ КРИТЕРИИ.//
   MA_1_t=iMA(NULL,0,Period_MA_1,MODE_LWMA,PRICE_TYPICAL,0);            //Свежие данные по МА 1.
   MA_2_t=iMA(NULL,0,Period_MA_2,MODE_LWMA,PRICE_TYPICAL,0);            //Свежие данные по МА 2.
    if(MA_1_t>MA_2_t+Rastvor*Point)                                     //Если разница между МА больше заявленной,то открываем ордер.
     {
      Opn_B=true;
     }
    if(MA_1_t<MA_2_t+Rastvor*Point)                                    //Если разница между МА больше заявленной,то открываем ордер.
     {
      Opn_S=true;
     }
   
  }
//+------------------------------------------------------------------+
//+-------------------------------------------------------------------------------------------------
                              //СТОИМОСТЬ ОРДЕРОВ.//
//+-------------------------------------------------------------------------------------------------
   RefreshRates();
   Min_Lot=MarketInfo(Symbol,MODE_MINLOT);
   Free=AccountFreeMargin();
   Step=MarketInfo(Symbol,MODE_LOTSTEP);
   
   if (Lots < Min_Lot)
   Lot=Min_Lot;
   
   if(Lot >= Min_Lot)
   Lots=Lots;
   
   else
    Lots=MathFloor(Free*Prots/One_Lot/Step)*Step); 
    
    if(Lots * Min_Lot > Free)
     {
      Alert("Не хватает денег на счете", Lts," лотов");
      return;
     }                           
//+----------------------------------------------------------------------------------+
                        //ОТКРЫТИЕ ОРДЕРОВ//
   {
    if (Opn_B==true)                                           //Критерий окрытия ордера Buy.
     {     
      RefreshRates();
      SL=Bid-New_Stop(StopLoss)*Point;                        //Вычисление SL открываемого ордера.
      TP=Bid+New_Stop(TakeProfit)*Point;                      //Вычисление TP открываемого ордера.
      Alert("Попытка открыть ордер Buy.Ожидание ответа");
      Ticket=OrderSend(Symbol,OP_BUY,Lts,Ask,2,SL,TP);          //Открытие ордера Buy.
    if (Ticket > 0)                                           //Получилось.
     {
      Alert("Открыт ордер Buy.",Ticket);
      return;                                                 //Выход из OnTick.
     }
    if (Fun_Error(GetLastError)==1)                           //Обработка ошибок.
      continue;                                               //Повторная попытка.
      return;                                                 //Выход из OnTick.
     }
    if (Opn_S==true)                                          //Критерий открытия ордера Sell.
     {
       RefreshRates();
       SL=Ask+New_Stop(StopLoss)*Point;                       //Вычисление SL открываемого ордера.
       TP=Ask-New_Stop(TakeProfit)*Point;                     //Вычисление TP открываемого ордера.
       Alert("Попытка открыть ордер Sell.Ожидание ответа.");
       Ticket=OrderSend(Symbol,OP_SELL,Lts,Bid,2,SL,TP);        //Открытие ордера Sell.
    if (Ticket > 0)                                           //Получилось.
     {
      Alert ("Открыт ордер Sell.",Ticket);
      return;                                                 //Выход из OnTick.
     }
    if (FunError(GetLastError)==1)                            //Обработка ошибок.
      continue;                                               //Повторная попытка.
      return;                                                 //Выход из OnTick.
     }
//+----------------------------------------------------------------------------------------------+
                              //ТРЕЙЛИНГ СТОП.
    void Trailing()
    RefreshRates();
    for (int i=OrdersTotal()-1;i>=0;i--)
    {                                                  //Проверяем все ордера,находящиеся в терминале.
    if  (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))                                        //Если успешно выбрался ордер.    
    if (OrderType()=OP_BUY)                                                               //Если открыт ордер на покупку.
    if (OrderSymbol()==Symbol && OrderMagicNumber()=Magic)                                //Проверяем наш ли ордер.
    if (Bid-OrderOpenPrice()>TrailingStop*Point || OrderStopLoss==StopLoss)               //Умножаем для пятизначных цен.Вычисляем разницу между ценой откр. и сравниваем с трейлингом.
    if (OrderStopLoss<Bid-(TrailingStep+TrailingStop)*Point || OrderStopLoss=StopLoss)
    if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits)0,0))
    
    if (OrderType()=OP_SELL)                                                              //Если открыт ордер на продажу.
    if (OrderSymbol()==Symbol && OrderMagicNumber()=Magic)                                //Проверяем наш ли ордер.
    if (Ask-OrderOpenPrice()>TrailingStop*Point || OrderStopLoss=StopLoss)                //Умножаем для пятизначных цен.Вычисляем разницу между ценой откр. и сравниваем с трейлингом.
    if (OrderStopLoss<Ask-(TrailingStep+TrailingStop)*Point || OrderStopLoss=StopLoss)
    if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits)0,0)) 
    }
//+-------------------------------------------------------------------------------------------------------------------  
     
       Ошибки:

}  - unexpected end of program    строка 155 столбец 5

{  -  unbalanced  parentheses        строка 29 столбец   3

proba 2.mq4

 

 

Edited by Capman
Link to post
Share on other sites
  • Replies 104
  • Created
  • Last Reply

Top Posters In This Topic

  • zvagolskiy.ru

    61

  • Hitronrav

    27

  • Ugar68

    14

  • Wowa

    1

Top Posters In This Topic

Popular Posts

На официальном сайте есть старенький учебник. https://book.mql4.com/ru Может не очень удобный, за то вроде как правильный.

Никогда не пользовался трейлинг стопами, но добавил. Отслеживает положение стопа на каждом тике. Если вам достаточно раз за свечу, то запихайте код трала под if(PrevTime!=iTime(Symbol(),0,0)) {

Я же вам предлагал сначала изучить C-подобный синтаксис. Одно из его правил – блочная инструкция окружается фигурными скобками {}. Блок начался – скобка открывается, блок кончился – скобка закрывается

Posted Images

Ugar68

Оператор if должен содержать как минимум условие, в круглых скобках, и действие, если это условие выполняется, после круглых скобок в фигурных скобках, или без фигурных скобок если действие одно.

if (!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-TrailingStop*Point,Digits)0,0))

Где действие?


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
zvagolskiy.ru

Спасибо.

Link to post
Share on other sites
  • 2 weeks later...
zvagolskiy.ru

Здравствуйте.Это опять я.Пробую написать советник.Пока самый простой.Написал код советника,а компилятор выдает одну ошибку:while-expressions are not allowed on a global scope строка 115,столбец 6.Помогите,пожалуйста разобраться в чем ошибка.Файл советника внизу.

 

proba 3.mq4

Link to post
Share on other sites
Hitronrav
3 часа назад, zvagolskiy.ru сказал:

Здравствуйте.Это опять я.Пробую написать советник.Пока самый простой.Написал код советника,а компилятор выдает одну ошибку:while-expressions are not allowed on a global scope строка 115,столбец 6.Помогите,пожалуйста разобраться в чем ошибка.Файл советника внизу.

 

"Выражения while недопустимы в глобальной области видимости", то есть вне функций. У вас функция OnTick() кончилась перед while. Для исправления эту фигурную скобку нужно перенести в конец кода:

image.png.83dfd0eaaa9a6e0d562f8f5647fe6436.png

 

Советую использовать стилизатор, чтобы не путаться в скобках. Стилизатор срабатывает по нажатию Ctrl+, (контрол–запятая). Только рекомендую в настройках переключить его стиль с MetaQuotes на какой-нибудь другой, потому что MetaQuotes разбивает else if'ы. Лично мне показался самым удобным Ratliff:

image.png.dce5569a11e8cc73727297273542f4aa.png

 

Edited by Hitronrav
Link to post
Share on other sites
zvagolskiy.ru

Спасибо большое.Сам бы я не разобрался.

 

Link to post
Share on other sites
Hitronrav
1 час назад, zvagolskiy.ru сказал:

Спасибо большое.Сам бы я не разобрался.

 

Ага, там кроме этого, ещё много с чем разбираться.

Прежде всего обратите внимание:

—  в условиях (if) пишется двойное равенство == а не одинарное =

— имена переменных не должны повторять названия встроенных функций (Symbol)

— не надо открытие позиции делать в бесконечном цикле – чуть что и советник зависнет; 2-3 попытки хватит, с паузами в секунду-другую между ними

— если вход по индикаторам, то достаточно один раз на открытии свечи прогнать функцию OnTick; для этого используем iTime

— должно быть ограничение на число позиций

 

Поправил ваш советник в соответствии со своим пониманием, можете сравнить с исходным:

proba 3 fixed.mq4

 

Кстати, если перевернуть торговую логику, то есть покупать вместо продажи и наоборот, внезапно получается отличный результат на часах в 2020 году:

image.png.fdf72346508d7b00709d8767b28e5720.png

 

Прибыльность 2,77 это очень круто, у меня таких граальных систем нет 🙄

Link to post
Share on other sites
zvagolskiy.ru

Еще раз спасибо большое.Я самоучка, учусь по учебнику Ковалева и что в интернете найду.Плохо когда рядом нет хорошего учителя,как говорится в живую.Приходится самому доходить до многого.Я живу в г.Черкесск,здесь нет программистов по mql,по крайней мере я не нашел.А самый простой трейлинг стоп можете добавить?Теперь буду разбирать ваш файл по буковкам.Буду изучать.Сам я торгую роботом дженерик.На ********** Форекс v.11.94.Еще есть ECN счет в Альпари,там торгую дженериком v.9.02 b стратегией 1-2-3.

Link to post
Share on other sites
Hitronrav
9 часов назад, zvagolskiy.ru сказал:

А самый простой трейлинг стоп можете добавить?

 

Никогда не пользовался трейлинг стопами, но добавил. Отслеживает положение стопа на каждом тике. Если вам достаточно раз за свечу, то запихайте код трала под

if(PrevTime!=iTime(Symbol(),0,0)) {

заодно исправил свою недоделку с открытием сделок только один раз за свечу, и добавил содержания в функцию Fun_Error (как понимаю, её идея взята из книги Ковалёва).

proba 3 trailing.mq4

 

Вообще, трейлинг стоп рекомендуют использовать в старых книгах о биржевом рынке в применении к долгосрочной торговле. Для форексного краткосрока считаю эту вещь вредной. Слишком сильно у нас цена болтается – короткие стопы цепляет, а потом идёт в сторону бывшего профита.

  • Upvote 1
Link to post
Share on other sites
Hitronrav

Прошу прощения, криворукий я сделал ошибку в советнике из предыдущего поста (позиции считались, только если трал работал) исправил методом копипаста:

proba 3 corrected.mq4

Link to post
Share on other sites
zvagolskiy.ru

Здравствуйте.У меня есть несколько вопросов по нашему советнику proba 3 correctid,только поймите меня правильно,я только учусь программированию.Учебник Ковалева хороший,но в процессе обучения все равно бывают вопросы.Если не хотите,не отвечайте,я пойму.Итак вопрос первый.Блок обработки ошибок работает так(если не правильно поправьте,пожалуйста).Когда советник запускается в работу,и например торговый сервер занят(ошибка №4),то в журнал приходит соответствующее сообщение и возвращает значение 1(не критическая ошибка),(значение 1 возвращается в первый оператор return)ждет сколько указано в операторе Sleep,и пробует еще раз(а сколько раз будет пробовать?).А если если например торговый счет заблокирован,то функция вернула значение 0 и опять после заданного в операторе Sleep ожидания функция пробует еще раз(опять сколько раз она будет пробовать?).И если опять вернулся ноль(во второй оператор return),то тогда уже будет проверятся значение переменной Work?И если оно равно false то советник закроется.А для чего третий оператор  return,самый последний в блоке обработок ошибок?Вообще правильно я изложил порядок работы блока обработки ошибок?                                                                                                                                                                          И второй вопрос.В блоке открытия ордеров если не получилось открыть ордер,то в функцию GetLastError возвращается значение 1.Эта функция самостоятельно пытается исправить ошибку(сколько раз пробует исправить?)?Или передает управление в блок обработки ошибок?Вообщем пока хватит вопросов.Еще раз прошу меня правильно понять.Я год назад понял,что программирование MQL это мое занятие.Мне интересно этим заниматься,но мне не у кого учиться.Но если вы заняты,то я пойму.

Link to post
Share on other sites
Hitronrav
2 часа назад, zvagolskiy.ru сказал:

Здравствуйте.У меня есть несколько вопросов по нашему советнику proba 3 correctid,только поймите меня правильно,я только учусь программированию.Учебник Ковалева хороший,но в процессе обучения все равно бывают вопросы.Если не хотите,не отвечайте,я пойму.Итак вопрос первый.Блок обработки ошибок работает так(если не правильно поправьте,пожалуйста).Когда советник запускается в работу,и например торговый сервер занят(ошибка №4),то в журнал приходит соответствующее сообщение и возвращает значение 1(не критическая ошибка),(значение 1 возвращается в первый оператор return)ждет сколько указано в операторе Sleep,и пробует еще раз(а сколько раз будет пробовать?).

 

Если речь о советнике proba 3 corrected, то будет пробовать 3 раза, потому что указано условие while(Tries<3).

Если же мы говорим о советнике из книги Ковалёва, то там стоит while(true), поэтому пробовать будет бесконечно.

 

Цитата

А если если например торговый счет заблокирован,то функция вернула значение 0 и опять после заданного в операторе Sleep ожидания функция пробует еще раз

 

Нет, если вернула 0, то сработает условие

else {
  break;
  }

и произойдёт выход из цикла while, совершаемый оператором break.

 

Цитата

И если опять вернулся ноль(во второй оператор return),то тогда уже будет проверятся значение переменной Work?И если оно равно false то советник закроется.

 

В советнике proba 3 corrected переменная Work нигде не изменяется, она всегда равна true. Нужно в функцию обработки ошибок добавить приравнивание Work значению false для ошибок, при которых работа советника становится бессмысленной (и перенести условие выхода по критической ошибке в OnTick), чтобы она начала использоваться.

В советнике из книги Ковалёва, если Work равно false, сразу происходит выход из потиковой функции и советник "крутится вхолостую".

 

Цитата

А для чего третий оператор  return,самый последний в блоке обработок ошибок?

 

Да на всякий случай он был поставлен, можно убрать смело 😁 так как на всех возможных путях выполнения уже стоят return'ы. 

 

Цитата

И второй вопрос.В блоке открытия ордеров если не получилось открыть ордер,то в функцию GetLastError возвращается значение 1.


GetLastError возвращает число, код ошибки – и больше ничего не делает. Коды ошибок бывают разные (4, 128,135 и т.д.) Дальше это число передаётся в функцию Fun_Error, которая для некритических ошибок (после которых можно пробовать открывать ордер ещё раз) возвращает 1, а для всех остальных 0.

 
Link to post
Share on other sites
zvagolskiy.ru

Спасибо за разъяснения.

Link to post
Share on other sites
zvagolskiy.ru

Здравствуйте,если я Вам еще не надоел,у меня есть несколько учебных вопросов(плохо,когда нет рядом преподавателя)Первый вопрос время ожидания Sleep пользователь сам определяет или есть какой-то стандарт для каждой ошибки.Если есть стандарт,где его можно посмотреть?Второй вопрос операторы break и Refreshreates используются в советнике исходя из каждой конкретной ситуации когда надо прервать исполнение кода или обновить данные или тоже есть какой то стандарт их использования?Третий вопрос код критической ошибки я правильно записал?Четвертый вопрос чем отличаютя переменные extern int     TrailingStop=500;extern int     TrailingStep=100;от переменных double pTrailingStop;double pTrailingStep.Пятый вопрос- static datetime PrevTime=0;-это когда эксперта присоединяют к графику,то экперт сам определяет на каком таймфреме он находится?Шестой вопрос-переменная- bool IsSucceeded(эксперт прекращает работу) это противоположная переменной Succeeded (иницилизация эксперта прошла успешно)?Так много вопросов,потомучто в учебнике Ковалева не все понятно.Учебник хороший,но плохо,когда рядом нет преподавателя.Вообще я хочу обьединить эксперт с трендовой стратегией и эксперт,основанный на боковом движении.Рынок ведь до 80% времени находится во флэте.Получится,что эксперт будет всегда в деле.Такое вообще возможно с точки зрения програмного кода?Я понимаю,что я не первый кто об этом подумал.Скорее всего все уже изобретено до меня,но все же,я ведь только учусь и собираюсь учиться серьезно и все хочу сам проверить и попробовать.
 

Link to post
Share on other sites
Hitronrav
45 минут назад, zvagolskiy.ru сказал:

Первый вопрос время ожидания Sleep пользователь сам определяет или есть какой-то стандарт для каждой ошибки.

 

Определяет сам. Наверно, для некоторых ошибок можно поставить время побольше (например, для 136 ERR_OFF_QUOTES несколько тысяч миллисекунд, чтобы дождаться котировок), для других ошибок достаточно и 100 мс.

 

Цитата

Второй вопрос операторы break и Refreshreates используются в советнике исходя из каждой конкретной ситуации когда надо прервать исполнение кода или обновить данные или тоже есть какой то стандарт их использования?

 

break используется для выхода из циклов for, while или из switch'а. Конкретно в советнике он выходит из while в случае успешного открытия позиции.

RefreshRates() нужна там, где есть вероятность, что котировки успели измениться за время работы функции. RefreshRates() обычно вызывают после тяжёлых вычислений, которые могут занимать секунды, или после паузы (Sleep). Кстати, в советнике по уму следует RefreshRates() переместить в строку после вызова Fun_Error, потому что вызывать её в начале цикла ни к чему, котировки в тот момент ещё свежие.

А по большому счёту RefreshRates() наследие эпохи реквот и на счетах с Market Execution особо не нужна! Сейчас с любой ценой отправляете ордер в рынок и он исполняется (но уже по той цене, которую брокер назначит).

 

Цитата

Третий вопрос код критической ошибки я правильно записал?

 

?

 

Цитата

Четвертый вопрос чем отличаютя переменные extern int     TrailingStop=500;extern int     TrailingStep=100;от переменных double pTrailingStop;double pTrailingStep.

 

Вторые умножены на Point, то есть превращены из пунктов в реальные ценовые значения.

1 пункт соответствует 0,00001 (если 5 знаков после запятой)

 

Цитата

Пятый вопрос- static datetime PrevTime=0;-это когда эксперта присоединяют к графику,то экперт сам определяет на каком таймфреме он находится?

 

static datetime PrevTime=0; – это для того, чтобы открытие ордеров и связанные с ним расчёты делались только один раз за свечу того таймфрейма, на котором находится советник. Мы создаём статическую (не теряющую своего значения между вызовами) переменную PrevTime, которую потом приравниваем времени текущей свечи, если она не равна ему. А если равна, то ничего не считаем и не открываем. То есть, когда свеча меняется, PrevTime становится не равна времени этой новой свечи и поэтому код под условием исполняется.

 

Узнать таймфрейм можно функцией Period().

 

Цитата

Шестой вопрос-переменная- bool IsSucceeded(эксперт прекращает работу) это противоположная переменной Succeeded (иницилизация эксперта прошла успешно)?

 

IsSucceeded – переменная, которая принимает значение, возвращаемое OrderSelect, она далее ни для чего не используется. Я сделал так, потому что мы вызываем OrderSelect в цикле, который просто не начнётся, если позиций нет. Иначе пришлось бы проверять, равно ли IsSucceeded true, и только тогда что-то там считать.

Переменной Succeeded в советнике нет. Есть предопределённая константа INIT_SUCCEEDED (вместо которой можно написать просто 0).

 

Цитата

Вообще я хочу обьединить эксперт с трендовой стратегией и эксперт,основанный на боковом движении.Рынок ведь до 80% времени находится во флэте.Получится,что эксперт будет всегда в деле.Такое вообще возможно с точки зрения програмного кода?

 

С точки зрения кода возможно, с точки зрения прибыльности – 🙄

Edited by Hitronrav
Link to post
Share on other sites
zvagolskiy.ru

Здравствуйте.С Вашего позволения есть у меня еще несколько вопросов по этому советнику(а что делать,я ведь только учусь)Первый вопрос:если ошибка уже прописана в коде,как например в начале советника ошибка"Недостаточно баров.Советник не работает.",ее обязательно так же записывать в блоке обработки ошибок?В журнале советника показываются все сообщения,записанные в советнике,или только с блока обработки ошибок?Второй вопрос:В функцию обработки ошибок переменную Work я правильно добавил?Третий вопрос:Обязательно в блоке обработки ошибок записывать все возможные варианты ошибок?Или это делается по мере необходимости?Если например во время работы советник перестал работать,а эта ошибка не записана в коде и в блоке обработки ошибок?Значит программисту придется искать причину?Четвертый вопрос:протестировал советник со всеми исправлениями,не слился.Для меня это уже достижение,но показал прибыль  всего 3 % в год.Как Вы считаете стоит его оптимизировать или это уже бесполезно(именно этот советник,основанный на пересечении двух МА)И последний вопрос:Я торгую советником generic.Вообщем хороший советник.Может подскажете хороший советник?Я вообще хочу в идеале торговать несколькими роботами у разных брокеров.Перепробовал не менее 100 роботов.Но пока лучше дженерика не нашел .

Strategy Tester Report
proba 3 trailing
Alpari-Standard3 (Build 1220)

 

Символ EURUSD (Euro vs US Dollar)
Период 1 Час (H1) 2010.03.01 00:00 - 2020.02.28 23:00 (2010.03.01 - 2020.03.01)
Модель Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов)
Параметры Period_MA_1=12; Period_MA_2=24; StopLoss=300; TakeProfit=1000; Magic=12345; TrailingStop=500; TrailingStep=100; Rastvor=280; Lots=0.1; Prots=0;
 
Баров в истории 63013 Смоделировано тиков 197705584 Качество моделирования 25.00%
Ошибки рассогласования графиков 0        
 
Начальный депозит 1000.00     Спред 10
Чистая прибыль 381.76 Общая прибыль 13672.27 Общий убыток -13290.51
Прибыльность 1.03 Матожидание выигрыша 0.46    
Абсолютная просадка 317.53 Максимальная просадка 973.56 (54.70%) Относительная просадка 54.70% (973.56)
 
Всего сделок 824 Короткие позиции (% выигравших) 423 (34.04%) Длинные позиции (% выигравших) 401 (29.93%)
  Прибыльные сделки (% от всех) 264 (32.04%) Убыточные сделки (% от всех) 560 (67.96%)
Самая большая прибыльная сделка 99.09 убыточная сделка -33.28
Средняя прибыльная сделка 51.79 убыточная сделка -23.73
Максимальное количество непрерывных выигрышей (прибыль) 7 (430.84) непрерывных проигрышей (убыток) 16 (-436.64)
Макс. непрерывная прибыль (число выигрышей) 430.84 (7) непрерывный убыток (число проигрышей) -436.64 (16)
Средний непрерывный выигрыш 1 непрерывный проигрыш 3

Graph

proba 3 corrected.mq4

Link to post
Share on other sites
zvagolskiy.ru

По второму вопросу я кажется не правильно загрузил файл.

 

Вот этот файл.

proba 3 trailing.mq4

Link to post
Share on other sites
zvagolskiy.ru

Еще один вопрос:а что значит вид переменной input в заголовке советника? Чем он отличается от extern?

Link to post
Share on other sites
Hitronrav
2 часа назад, zvagolskiy.ru сказал:

Первый вопрос:если ошибка уже прописана в коде,как например в начале советника ошибка"Недостаточно баров.Советник не работает.",ее обязательно так же записывать в блоке обработки ошибок?

 

Нет. Это, собственно, не ошибка, просто советник не сможет рассчитать значение MA, если не хватает баров, поэтому там прописан выход.

 

2 часа назад, zvagolskiy.ru сказал:

В журнале советника показываются все сообщения,записанные в советнике,или только с блока обработки ошибок?

 

Всё, что выводят Alert'ы и Print'ы.

 

2 часа назад, zvagolskiy.ru сказал:

Второй вопрос:В функцию обработки ошибок переменную Work я правильно добавил?

 

Неправильно. Во-первых, в первом switch'е уже прописан выход из функции при default, поэтому ваш switch не сработает. Во-вторых, если написать switch(0), то это даст единственное значение 0 и всё. В-третьих, ошибки с кодом 1000 вроде бы не существует. В-четвёртых, никакое значение переменной Work не присваивается.

 

2 часа назад, zvagolskiy.ru сказал:

Третий вопрос:Обязательно в блоке обработки ошибок записывать все возможные варианты ошибок?Или это делается по мере необходимости?

 

По мере необходимости.

 

2 часа назад, zvagolskiy.ru сказал:

Если например во время работы советник перестал работать,а эта ошибка не записана в коде и в блоке обработки ошибок?Значит программисту придется искать причину?

 

Придётся.

 

2 часа назад, zvagolskiy.ru сказал:

Четвертый вопрос:протестировал советник со всеми исправлениями,не слился.Для меня это уже достижение,но показал прибыль  всего 3 % в год.Как Вы считаете стоит его оптимизировать или это уже бесполезно(именно этот советник,основанный на пересечении двух МА)

 

У меня скептическое отношение к советникам на MAшках, но вы, конечно, можете оптимизировать.

И да, пожалуйста, не работайте с советником, который trailing, работайте с тем, который corrected. В версии trailing содержится ошибка – бесконечное открытие позиций при трейлинг-стопе равном нулю. При этом результат существенно более прибылен именно без трейлинг-стопа (то есть когда он равен нулю в параметрах). 

 

2 часа назад, zvagolskiy.ru сказал:

И последний вопрос:Я торгую советником generic.Вообщем хороший советник.Может подскажете хороший советник?

 

Нет, я своим торгую, но он не продаётся и тем более не отдаётся даром 😁

 

2 часа назад, zvagolskiy.ru сказал:

Еще один вопрос:а что значит вид переменной input в заголовке советника? Чем он отличается от extern?

 

Значения input переменных нельзя изменять в коде советника, а extern можно.

Link to post
Share on other sites
zvagolskiy.ru

Спасибо за разьяснения.

Link to post
Share on other sites
  • 1 month later...
zvagolskiy.ru

Здравствуйте.Я сейчас изучаю по видео уроку советник generic.Делаю все как говорится в видео,но компилятор выдает три ошибки:" ;" unexpected end of program строка 18; столбец 74; "{ "  unbalanced parentheses  строка 46 столбец 4 ; open parentheses expected строка 22, столбец 28.proba generic.mq4  Подскажите,пожалуйста,где мои ошибки?

Link to post
Share on other sites
Ugar68
03.07.2020 в 13:49, zvagolskiy.ru сказал:

Здравствуйте.Я сейчас изучаю по видео уроку советник generic.Делаю все как говорится в видео,но компилятор выдает три ошибки:" ;" unexpected end of program строка 18; столбец 74; "{ "  unbalanced parentheses  строка 46 столбец 4 ; open parentheses expected строка 22, столбец 28.proba generic.mq4  Подскажите,пожалуйста,где мои ошибки?

Кашмар!!!! Не знаю что за видеоуроки. Судя по результату, им место в помойке.

Подскажу. Ошибки везде. Ну почти.

Вот в этих строчках нет ошибок:

extern int Magic=12345 ;      

   double MinLot,MaxLot,LotStep;
   int PriceDigits;

Хотя, переменная PriceDigits не нужна, так как для текущего символа уже предусмотрена переменная _Digits и в ней уже есть значение по символу.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
zvagolskiy.ru

Просто есть большое желание учиться этому,но нет хорошей учебной базы.

Link to post
Share on other sites
Hitronrav

Этот видео урок пригоден для тех, кто знает основы языка MQL4. Вам же, судя по всему, нужно вначале изучить основы программирования как такового и Си-подобный синтаксис, который и используется в MQL4.

 

 

Edited by Capman
п.8
Link to post
Share on other sites
zvagolskiy.ru

Спасибо .

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...