Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 869

 
Top2n:

 Вы уж извините, стыдно обращаться по сто раз на одном и том же.

Ну уже почти месяц смотрю как баран на ворота. Ничего не пойму.

Задача высчитать скользящую среднюю меньшего порядка, имея скользящую 13,

то есть высчитать период 12, основываясь на 13

 

Легко вычислить: Y(N)=1/N*(Y(N+1)*(N+1)-X[N]), где Y(i) - значение МА(i) на нулевом баре, X[j] - значение цены на j-ом баре; только это - вычислительный нонсенс, а в будущее заглянуть все-равно не позволит. 
 

Здравствуйте! Кто-нибудь из уважаемых гуру, проверьте, плиз, начало моего первого советника. Можно ли двигаться дальше? Может что упустил? Буду очень благодарен за любую конкретику. И еще: где-то на форуме видел, как сделать, чтобы открывалась только одна позиция, но не скопировал, а теперь не могу найти. Помогите, плиз.

Спасибо!

// Пробный вариант советника

//--------------------------------------------------------------------

//------Вводные данные:-----------------------------------------------------------

 input double Lots         = 0.1;                  // Лот                            

 input int MovingPeriod  =5;                       // Расчетный период МА

 input int MovingShift   =0;                       // Сдвиг МА

 input int    InpBandsPeriod=10;                   // Период Bollinger Bands 

 input int    InpBandsShift=0;                     // Сдвиг Bollinger Bands

 input double InpBandsDeviations=2.0;              // Отклонение Bollinger Bands

 input int K_Period  =30;                          // %K период Stochastic

 input int D_Period  =10;                          // %D период Stochastic

 input int Slowdawn  =8;                           // Замедление Stochastic

 input color clMainStoch  =Yellow;                 // Цвет главной линии Stochastic

 input color clSignalStoch  =Red;                  // Цвет сигнальной линии Stochastic

// -----Объявляем Глобальные переменные:------------------------------------------

   double MA_0, MA_1, MA_2;                   // Значение МА на 0, 1 и 2 барах 

   double MB_0, MB_1, MB_2;                   // Значение средней Bollinger на 0, 1 и 2 барах

   double ExtUpperBuffer[];                   // Значение верхней линии Bollinger

   double ExtLowerBuffer[];                   // Значение нижней линии Bollinger 

   double Delta_0, Delta_1;                   // Разница межу значениями верхней и нижней ...

                                              // ...линий Bollinger на 0 и 1 барах

   double Yellow_0, Yellow_1, Yellow_2;            // Значение MAIN на 0, 1 и 2 барах

   double Red_0, Red_1, Red_2;                     // Значение SIGNAL на 0, 1 и 2 барах

//-------Поехали!----------------------------------------------------------------

int start()                                        //Спец. функция start

  {

                                                   //Обращение к функции индикатора МА

     MA_0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

     MA_1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);

     MA_2=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2);

                                                   //Обращение к функции Bollinger Bands

     MB_0=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,0);

     MB_1=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,1);

     MB_2=iBands(NULL,0,InpBandsPeriod,InpBandsShift,InpBandsDeviations,PRICE_CLOSE,2);

     Delta_0=iBands(ExtUpperBuffer[0]-ExtLowerBuffer[0]);

     Delta_1=iBands(ExtUpperBuffer[1]-ExtLowerBuffer[1]);

                                                   //Обращение к функции Stochastic

     Yellow_0=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,0);

     Yellow_1=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,1);

     Yellow_2=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,2);

     Red_0=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,0);

     Red_1=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,1);

     Red_2=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,2); 

     

//-------Ситуации по Стохастику:-----------------------------------------------------

                                                      //Рынок перекуплен

      double MOB()=(Yellow_0>=80 && Red_0>=80);          //Локальная переменная

                                                      //Рынок перепродан

      double MOS()=(Yellow_0<=20 && Red_0<=20);          //Локальная переменная

                                                      //Рынок в норме

      double MN()=(20<Yellow_0<80 && 20<Red_0<80);       //Локальная переменная

                                                      //Критическая ситуация

      double MC1()=(20<Yellow_0<80 && Red_0<=20);        //Локальная переменная

      double MC2()=(20<Yellow_0<80 && Red_0>=80);        //Локальная переменная

      double MC3()=(20<Red_0<80 && Yellow_0<=20);        //Локальная переменная

      double MC4()=(20<Red_0<80 && Yellow_0>=80);        //Локальная переменная  

         

//-------Пример(мой) приказа на открытие позиции-----------------------------------------------------


   if (Delta_0 > Delta_1 && MOB()==true)              //Рынок перекуплен, но дельта расширяется

     { if (MB_2 > MB_1 && MB_1 < MB_0)                //Нижний перелом Боллинджера

  OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point);//открываем ордер БАЙ

  Alert (GetLastError());                                            //Сообщение об ошибке  

  Alert("Открыта позиция БАЙ лотом("Lots"),цена("Ask").");           //Сообщение о покупке  

 

В догонку: позиции БАЙ (как и  СЕЛЛ) могут открываться при разных условиях, и в зависимости от того, на  каких условиях открылась поз. (напр. БАЙ), будут свои условия закрытия.

Как это передать на языке МКЛ? 

 
rapid_minus:

В догонку: позиции БАЙ (как и  СЕЛЛ) могут открываться при разных условиях, и в зависимости от того, на  каких условиях открылась поз. (напр. БАЙ), будут свои условия закрытия.

Как это передать на языке МКЛ? 

Выбираем ордер в цикле. Если это Бай, и остальные данные (символ, магик, ещё чего-нить) соответствуют критерию того, что вот его-то и нужно закрывать при "своих условиях закрытия", то закрываем его, если "свои условия закрытия" имеют место быть.
 
artmedia70:
Выбираем ордер в цикле. Если это Бай, и остальные данные (символ, магик, ещё чего-нить) соответствуют критерию того, что вот его-то и нужно закрывать при "своих условиях закрытия", то закрываем его, если "свои условия закрытия" имеют место быть.

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

Я додумался закрывать так:

//-------Пример(мой) приказа на открытие позиции с привязкой закрытия (по тикету)----------------------------------------------------- 

                                                      

                                                      //Локальная переменная, открывающая ордер БАЙ(вместо строки 63)

   int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point));

   

        //-------Тогда закрытие именно для этого приказа может быть таким:-----------------------------------------------------

    

    if (Ticket_1()==true)                              //Если был открыт ордер №1, то...

     { if (Yellow_0>Red_0 && (Yellow_0-Red_0)<(Yellow_1-Red_1)) //Желтая выше красной, сужение(условие)

        { if (MA_2 < MA_1 && MA_1 > MA_0);}                      //Верхний перелом Средней (условие)

       else (Yellow_0>Red_0 && (Yellow_0-Red_0)>(Yellow_1-Red_1)) //Желтая выше красной, расширение(альтерн.условие)

         { if (MB_2 < MB_1 && MB_1 > MB_0);}                      //Верхний перелом Боллинджера (условие)

       

       bool Ans=OrderClose(Ticket,Lot,Bid,0);          //...закрытие ордера (лок.переменная)                                               

   Alert("Попытка закрыть ордер БАЙ лотом("Lots"),цена("Ask"). Ожидание ответа..");

   if (Ans==true)                                     // Получилось :)

        {

         Alert ("Закрыт ордер БАЙ лотом("Lots"),цена закрытия("Bid");

         break;                                       // Выход из цикла закрытия позиции

        }


     } 

 

Просьба дать анализ, ну и по предыдущему посту тоже. Извините за настырность, но Вы же видите - Вы единственный, кто отвечает... Спасибо! 

 
//-------Пример(мой) приказа на открытие позиции с привязкой закрытия (по тикету)----------------------------------------------------- 
                                                      
                                                      //Локальная переменная, открывающая ордер БАЙ(вместо строки 63)
   int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point));
   
        //-------Тогда закрытие именно для этого приказа может быть таким:-----------------------------------------------------
    
    if (Ticket_1()==true)                              //Если был открыт ордер №1, то...
     { if (Yellow_0>Red_0 && (Yellow_0-Red_0)<(Yellow_1-Red_1)) //Желтая выше красной, сужение(условие)
        { if (MA_2 < MA_1 && MA_1 > MA_0);}                      //Верхний перелом Средней (условие)
       else (Yellow_0>Red_0 && (Yellow_0-Red_0)>(Yellow_1-Red_1)) //Желтая выше красной, расширение(альтерн.условие)
         { if (MB_2 < MB_1 && MB_1 > MB_0);}                      //Верхний перелом Боллинджера (условие)
       
       bool Ans=OrderClose(Ticket,Lot,Bid,0);          //...закрытие ордера (лок.переменная)                                               
   Alert("Попытка закрыть ордер БАЙ лотом("Lots"),цена("Ask"). Ожидание ответа..");
   if (Ans==true)                                     // Получилось :)
        {
         Alert ("Закрыт ордер БАЙ лотом("Lots"),цена закрытия("Bid");
         break;                                       // Выход из цикла закрытия позиции
        }

     }
Так гораздо легче читать. Извините.
 
rapid_minus:

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

Я додумался закрывать так:

...

 

Просьба дать анализ, ну и по предыдущему посту тоже. Извините за настырность, но Вы же видите - Вы единственный, кто отвечает... Спасибо! 

Ну как-то субмурно всё у вас.

1. Определяете факт наступления условия для закрытия ордера Buy

2. В цикле просматриваете все открытые позиции и, когда находите нужный ордер Buy, закрываете его.

Вот пример цикла:

void ClosePositions(string symbol, int type, int magic) {
   for(int i=OrdersTotal()-1; i>=0; i--) {      // цикл по открытым ордерам
      if(OrderSelect(i,SELECT_BY_POS)) {        // выбираем ордер по индексу
         if(OrderMagicNumber()!=magic) continue;// если магик не искомый - ищем дальше
         if(OrderSymbol()!=symbol)     continue;// если символ не тот - ищем дальше
         if(OrderType()!=type)         continue;// если тип ордера не тот - ищем дальше
         // здесь, если ордер выбран, то он соответствует нужным критериям,
         // вызов функции закрытия выбранного ордера по тикету
         }
      }   
   }

Т.е., для того, чтобы закрыть ордер Buy на текущем символе (на графике, где запущен советник) и с магиком 100500 (например), нужно вызвать функцию так:

ClosePositions(Symbol(),OP_BUY,100500);

Вовсе не обязательно писать число 100500, обычно магик уже задан в советнике переменной, например int Magic = 100500; Тогда вам вместо 100500 нужно вписать Magic

В цикле там, где должно быть закрытие выбранной позиции, я не стал ничего писать, так как там должен быть вызов функции закрытия ордера по тикету. Обычно это вызов полноценной функции с обработкой кодов возврата торгового сервера. Вы, для проверки, можете вписать туда простую команду закрытия выбранного ордера OrderClose();

 
rapid_minus:
Так гораздо легче читать. Извините.

Есть ещё возможность править старый пост, чтобы не плодить дубли ;)

 
evillive:
Есть ещё возможность править старый пост, чтобы не плодить дубли ;)
Попытался, но SRC уже не вставляет.
 
artmedia70:

Ну как-то субмурно всё у вас.

1. Определяете факт наступления условия для закрытия ордера Buy

2. В цикле просматриваете все открытые позиции и, когда находите нужный ордер Buy, закрываете его.

Вот пример цикла:

Т.е., для того, чтобы закрыть ордер Buy на текущем символе (на графике, где запущен советник) и с магиком 100500 (например), нужно вызвать функцию так:

Вовсе не обязательно писать число 100500, обычно магик уже задан в советнике переменной, например int Magic = 100500; Тогда вам вместо 100500 нужно вписать Magic

В цикле там, где должно быть закрытие выбранной позиции, я не стал ничего писать, так как там должен быть вызов функции закрытия ордера по тикету. Обычно это вызов полноценной функции с обработкой кодов возврата торгового сервера. Вы, для проверки, можете вписать туда простую команду закрытия выбранного ордера OrderClose();


Спасибо. Но как я понял, магик присваивается автоматически при открытии ордера. Поэтому по магику я не могу определить, на каких условиях открыт ордер, и, соответственно, не знаю, по каким условиям его закрывать.