Скачать MetaTrader 5

Помогите с написанием эксперта

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
ilya
24
ilya 2014.10.07 20:31 

Я новичок в программировании.
Пишу эксперта по стохастике. Необходимо что бы советник (например) продавал каждый раз как только главная линия находилась выше зоны перекупленности и мне нужно необходимо отделить часть условия продажи первого ордера от второго и т.д. что бы расчитать лот по некоторой схеме.
Советник продавал какждый бар пока цена находилась выше зоны, я поставил ограничение на кол-во ордеров и добавил условие ниже. На условие открытия второго ордера советник не реагирует.
В чем причина? подскажите как упростить код до бесконечного (грубо говоря)  мартингейла начиная со второго ордера.

    if (Time[0]<=PrevTime) return(0);

    PrevTime=Time[0];

    {

   //total=OrdersTotal();

   // if (total<1)

    { 

    if ((MSC>=SSC) && (MSC>=HighZone)  && (CountSell() < 1))

      {

         SL = NormalizeDouble(Bid + StopLoss * Point, Digits);

         TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, Magic, 0, Red);

            if (ticket > 0)

            {

               if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)

               {

                     OrderModify(ticket, OrderOpenPrice(), 0, TP, 0, Red);

                     int j=0;

               }

            }

      }

      if ((MSC<=HighZone) && (CountSell() > 0))

      {

         j=1;

      }

      if ((MSC>=SSC) && (MSC>=HighZone) && (j==1))

      {

         SL = NormalizeDouble(Bid + StopLoss * Point, Digits);

         TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

         ticket = OrderSend(Symbol(), OP_SELL, Lots(другой, расчитываемый после проверки данного условия), Bid, Slippage, 0, 0, 0, Magic, 0, Red);

            if (ticket > 0)

            {

               if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)

               {

                     OrderModify(ticket, OrderOpenPrice(), 0, TP, 0, Red);

                     j=0;

               }

            }

       }

Mikhail Filimonov
5931
Mikhail Filimonov 2014.10.08 01:36  

Demidoff113,

1. Вы пишите для МТ-4 или МТ-5?

2. Чтобы вставить в пост код, небходимо нажать "SRC" и туда помещать код.

3. Перед тем как писать советника, нужно ознакомится с документацией и примерами

на этойм сайте(их огромное кол-во).

Удачи! 

nowi
1066
nowi 2014.10.08 07:23  
Mikalas:

Demidoff113,

1. Вы пишите для МТ-4 или МТ-5?

для МТ4... "OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, Magic, 0, Red);" использование этой функции об этом говорит. в МТ5 нужна структура 

нужно в начале кода делать проверку на наличие ордеров и позиций и если они > 0   return;

надо понимать что код читается сверху вниз и слево на право. как только код прочитан, при следующем тике он будет снова читать сверху вниз и дойдет до этого:

 if ((MSC>=SSC) && (MSC>=HighZone)  && (CountSell() < 1))

      {

         SL = NormalizeDouble(Bid + StopLoss * Point, Digits);

         TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, Magic, 0, Red);

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

ilya
24
ilya 2014.10.08 16:01  
Mikalas:

Demidoff113,

1. Вы пишите для МТ-4 или МТ-5?

2. Чтобы вставить в пост код, небходимо нажать "SRC" и туда помещать код.

3. Перед тем как писать советника, нужно ознакомится с документацией и примерами

на этойм сайте(их огромное кол-во).

Удачи! 

Спасибо огромное!
ilya
24
ilya 2014.10.08 16:09  
nowi:
для МТ4... "OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, Magic, 0, Red);" использование этой функции об этом говорит. в МТ5 нужна структура 

нужно в начале кода делать проверку на наличие ордеров и позиций и если они > 0   return;

надо понимать что код читается сверху вниз и слево на право. как только код прочитан, при следующем тике он будет снова читать сверху вниз и дойдет до этого:

 if ((MSC>=SSC) && (MSC>=HighZone)  && (CountSell() < 1))

      {

         SL = NormalizeDouble(Bid + StopLoss * Point, Digits);

         TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, Magic, 0, Red);

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

MT4.
Как может выставиться второй ордер если в в условии КоличествоПродаж < 1. Оно не проходное для второго ордера, но с этим я уже разобрался. Неправильно были прописаны последующие условия.
Они выполнялись оба за один тик из-за того что CountSell становился >0. 
Возможно я объяснил тоже самое, но спасибо за помощь. :)

 

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий