Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нашел прибыльную стратегию? Заведи торговый сигнал и заработай на этом!
sTs55900
7
sTs55900 2016.10.15 07:20 

Вроде все по уроку делал, может что пропустил?

//+------------------------------------------------------------------+

//|                                                       martin.mq4 |

//|                        Copyright 2016, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2016, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict


extern double Lots       = 0.1;

extern int    TakeProfit = 30; 

extern int    Step       = 50;

extern double Multipler  = 2;

extern int    Magic      = 123;

//extern int    tframe     = 60;

extern int    period     = 14;

extern int    Slippage   = 3;


double tp, price, lastlot;

int ticket ;


//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

   if (Digits == 3 || Digits == 5)

   {

      TakeProfit *=10;

      Step       *=10;

   }

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {


   

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

{

   double ima = iMA(Symbol(), 0, period, 0, MODE_SMA, PRICE_CLOSE, 0);

   

   if (CountTrades() == 0)

      if (Ask > ima)   

      {

         tp = NormalizeDouble(Ask + TakeProfit*Point, Digits);

         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, tp, "", Magic, 0, Blue);

      }

      else

      {

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

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

      }

   else 

   {

      int order_type = FindLastOrderType();

      if(order_type == OP_BUY)

      {

         price = FindLastOrderPrice(OP_BUY);

         if(Ask <= price - Step*Point)

         {

            lastlot = FindLastLots(OP_BUY);

            lastlot = NormalizeDouble(lastlot * Multipler, 2);

            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", Magic, 0, Blue);

            if (ticket < 1)

              Print("Ошибка открытия ордера на покупку");

            ModifyOrders(OP_BUY);

         }

      }

      

      if(order_type == OP_SELL)

      {

         price = FindLastOrderPrice(OP_BUY);

         if(Bid >= price + Step*Point)

         {

            lastlot = FindLastLots(OP_SELL);

            lastlot = NormalizeDouble(lastlot * Multipler, 2);

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

            if (ticket < 1)

               Print("Ошибка открытия ордера на продажу");

            ModifyOrders(OP_SELL);

         }

      }

      

   }

   

}

//+------------------------------------------------------------------+

void ModifyOrders(int otype)

{

   double avg_price, order_lots=0;

   price = 0;

   for(int i=OrdersTotal()-1;i>=0;i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)

         {

            price += OrderOpenPrice() * OrderLots();

            order_lots += OrderLots();

         }         

      }

   }

   

   avg_price = NormalizeDouble(price / order_lots, Digits);

   

   if (otype == OP_BUY)  tp = NormalizeDouble(avg_price + TakeProfit*Point, Digits);

   if (otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit*Point, Digits);

   

   for (int i = OrdersTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)

         {

            if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))

               Print("Ордера успешно модифицированны");

            else  Print("Ошибка модификации ордеров");

            

         }

      }

   }

   

}

//+------------------------------------------------------------------+

double FindLastLots(int otype)

{

   int oldticket=0;

   double oldlots=0;

   ticket = 0;

   for(int cnt = OrdersTotal()-1; cnt>=0; cnt--)

   {

      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)

            oldticket = OrderTicket();

            if (oldticket > ticket)

            {

               ticket = oldticket;

               oldlots = OrderLots();

            } 

      }

   }

   return(oldlots);

//+------------------------------------------------------------------+

int CountTrades() 

{

   int count = 0;

   for(int i=OrdersTotal()-1; i>=0;i--)

   {

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

            if (OrderType() == OP_BUY || OrderType() == OP_SELL)

               count ++;

      }

   }

   return(count);

}

//+------------------------------------------------------------------+

int FindLastOrderType()

{

   for(int i = OrdersTotal()-1; i>=0; i--)

   {

      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

            return(OrderType());

      }

   }

   return(-1);

}

//+--------------------------------------------------------------------=

double FindLastOrderPrice(int otype)

{

   int oldticket=0;

   double oldopenprice=0;

   ticket = 0;

   for(int cnt = OrdersTotal()-1; cnt>=0; cnt--)

   {

      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)

            oldticket = OrderTicket();

            if (oldticket > ticket)

            {

               ticket = oldticket;

               oldopenprice = OrderOpenPrice();

            } 

      }

   }

   return(oldopenprice);

}

//+--------------------------------------------------------+

Vitalie Postolache
11069
Vitalie Postolache 2016.10.15 08:40  

Пропустил, а как же.

Если в качестве параметров функции передать неизмененные значения, то в этом случае будет сгенерирована ошибка 1 (ERR_NO_RESULT).

 В частности, тут передаётся параметр SL=0 (а в ордере он и так 0), а надо бы OrderStopLoss(), также экспирация, лучше передавать OrderExpiration().

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