[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 18

 
Figar0 >>:

Выложите весь код, стоплосами тут пока вообще не пахнет...

Дело не в стоплоссах, а в том, что бы позиция закрывалась как только цена касалась MA

 
Novice писал(а) >>

Дело не в стоплоссах, а в том, что бы позиция закрывалась как только цена касалась MA

Пусть так, про стоплосы это Вы писали...) Всеодно, без кода понять почему не работает не представляется возможным, выложеный кусок не информативен напрочь.

 
Figar0 >>:

Пусть так, про стоплосы это Вы писали...) Всеодно, без кода понять почему не работает не представляется возможным, выложеный кусок не информативен напрочь.

Должно быть я очень не точно выразился, извиняюсь, я имел ввиду, что сами MA должны служить стоплоссом, то бишь

Novice >>:

... позиция закрывалась как только цена касалась MA


А код крайне примитивен:


         Ticket=OrderTicket();                 
         Tip   =OrderType();                   
         Lot   =OrderLots();                   

    MA2C=iMA(NULL,0,Period_MA2,0,MODE_SMA,PRICE_CLOSE,0); //Есть две MA с разным периодом.
    MA3C=iMA(NULL,0,Period_MA3,0,MODE_SMA,PRICE_CLOSE,0); //И вот с такими параметрами.
     
     //Так же есть условия, при которых по идее должны срабатывать 
     // функции закрытия ордеров.
     
     RefreshRates();                  
    if (Tip==0 && Bid==MA2C)        //Обозначение типа ордера и условия закрытия
     {
      CloseBuy=true;                              // Закрыть Buy
     }
     RefreshRates();
    if (Tip==0 && Bid==MA3C)
     {
      CloseBuy=true;                              // Закрыть Buy
     }
     RefreshRates();
    if (Tip==1 && Ask==MA2C)
     {
      CloseSell=true;                               // Закрыть Sell
     }
     RefreshRates();
    if (Tip==1 && Ask==MA3C)
     {
      CloseSell=true;                               // Закрыть Sell
     }

        // Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && CloseBuy==true)                // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         ALERT=OrderClose(Ticket,Lot,Bid,3,Blue);      // Закрытие Buy
         if (ALERT==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Buy ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
        if (Tip==1 && CloseSell==true)                // Открыт ордер Sell..
        {                                       // и есть критерий закр
         Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         ALERT=OrderClose(Ticket,Lot,Ask,3,Red);      // Закрытие Sell
         if (ALERT==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Sell ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
      break;                                    // Выход из while
     }

Уже сейчас думаю, что 4 условия можно сменить на 2


     RefreshRates();
    if (Tip==0 && Bid==MA2C || Tip==0 && Bid==MA3C)
     {
      CloseBuy=true;                              // Критерий закр. Buy
     }
     RefreshRates();
    if (Tip==1 && Ask==MA2C || Tip==1 && Ask==MA3C)
     {
      CloseSell=true;                               // Критерий закр. Sell
     }
 
     RefreshRates();
    if (Tip==0 && (Bid==MA2C  || Bid==MA3C))
     {
      CloseBuy=true;                              // Критерий закр. Buy
     }
     RefreshRates();
    if (Tip==1 && (Ask==MA2C ||  Ask==MA3C))
     {
      CloseSell=true;                               // Критерий закр. Sell
     }

Тогда уж так) Хотя по-любому бредовый кусок, машки строятся по ценам Bid, и сранивать их так... Ну не знаю.

Что-то я у Вас в коде, OrderSelect не вижу?

 

Он стандартный, из учебника:


Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }

//И далее как выше...
Мне важно понять, возможно ли такое сделать в принципе, потому как при тестировании в режиме визуализации ордера не закрываются на MA
 
Novice писал(а) >>

Мне важно понять, возможно ли такое сделать в принципе, потому как при тестировании в режиме визуализации ордера не закрываются на MA

В принципе возможно. У Вас в системе возможен только ордер единовременно?

Попробуйте нормализовать цены Bid/Ask и значения MA при сравнении на равенство, это надо полюбому...

Каждый кусок кода надо клещями вытыскивать, у Вас там грааль?) Отчего просто сразу эксперт не приципить. Давно бы уж поправил.

 
Figar0 >>:

В принципе возможно. У Вас в системе возможен только ордер единовременно?

Попробуйте нормализовать цены Bid/Ask и значения MA при сравнении на равенство, это надо полюбому...

Каждый кусок кода надо клещями вытыскивать, у Вас там грааль?) Отчего просто сразу эксперт не приципить. Давно бы уж поправил.

После этого голова пошла кругом...

Нет) До Грааля как до другой галактики, лишь попытки реализовать и улучшить ТС.


Не получилось выложить в посте весь код, прикрепляю

Файлы:
g.ei.vn.gl..mq4  12 kb
 
Novice писал(а) >>

После этого голова пошла кругом...

Нет) До Грааля как до другой галактики, лишь попытки реализовать и улучшить ТС.

Не получилось выложить в посте весь код, прикрепляю

Ну там конечно бредово) Но в принцмпе как-то работает:

Единственно, что убрал увеличение лота. А Вы вроде говорили, что ордера не закрываются?

 
Не закрываются на MA, ровно в момент когда цена их касается. На MA2C и MA3C. По поводу бредово, да, я пока не доделал.


Так как...?

Figar0 >>:

...нормализовать цены Bid/Ask и значения MA при сравнении на равенство...

Я просто не совсем понимаю, как именно нормализовать... NormalizeDouble(Ask, Digits) ?

 

Проблема актуальна, до сих пор думаю как заставить ордера закрываться сразу же при достижении цены MA.


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

Причина обращения: