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

 
alvlaf:
Этот код на MQL5 написан?

for (int i=0; i<SymbolCount; i++)

   if (CountTrades() == 0) // Количество ордеров должно равняться нулю

   {

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) ||

      (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))  && MaxOpenOrders > OrdersTotal())

        // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = LastAsk;

         if (Type == OP_SELL) Price = LastBid;

         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

         ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 && MaxOpenOrders > OrdersTotal()

      // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = LastAsk;

         if (Type == OP_SELL) Price = LastBid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);  

         ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

       || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

        || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

      {

         if (SignalBuy(Symbols[i]) && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbols[i], OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (SignalSell(Symbols[i]) && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbols[i], OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

      }

   }

Код в OnTick после слов и так далее... Написан на MQL4, а тебе нужен MQL5?

На каждый OrderSend условие MaxOpenOrders должен быть не больше OrdersTotal(). 

Код процедур (убрал проверку OrderSymbol()==Symbol() и ввел iClose()/iOpen() вместо Close/Open), правильность кода не проверял:

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

int CountTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

int CountHistTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

bool SignalBuy(string Sym)

{

   for (int i=1; i<=Wait; i++)

   {

      double C = iClose(Sym, PERIOD_M5, i);  // Укажи здесь нужный таймфрейм

      double O = iOpen(Sym, PERIOD_M5, i); 

      if (C > O) return(false);

   }

   if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   return(false);

}

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

bool SignalSell(string Sym)

{

   for (int i=1; i<=Wait; i++)

   {

      double C = iClose(Sym, PERIOD_M5, i);  // Укажи здесь нужный таймфрейм

      double O = iOpen(Sym, PERIOD_M5, i); 

      if (C < O) return(false);

   }

   if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

    && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   return(false);

}

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

datetime TimeLastHistOrder(int type = -1)

{

   datetime lasttime = 0;

   datetime opentime = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > lasttime)

            {

               lasttime = OrderCloseTime();

               opentime = OrderOpenTime();

            }

         }

      }

   }

   return(opentime);

}

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

int TypeLastHistOrder()

{

   datetime time = 0;

   int type = -1;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic)

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               type = OrderType();

            }

         }

      }

   }

   return(type);

}

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

double LotsLastHistOrder(int type = -1)

{

   datetime time = 0;

   double lots = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderOpenTime() > time)

            {

               time = OrderOpenTime();

               lots = OrderLots();

            }

         }

      }

   }

   return(lots);

}

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

double PriceCloseLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderClosePrice();

            }

         }

      }

   }

   return(price);

}

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

double PriceOpenLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderOpenPrice();

            }

         }

      }

   }

   return(price);

} 

 
alvlaf:

extern int          Exp              = 1;

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

Этот код у тебя работает??? Здесь дата должна быть, причем больше текущей на 10 минут (т.е. TimeCurrent() + 600 минимум).

 
A13ksandr:

for (int i=0; i<SymbolCount; i++)

   if (CountTrades() == 0) // Количество ордеров должно равняться нулю

   {

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) ||

      (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))  && MaxOpenOrders > OrdersTotal())

        // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = LastAsk;

         if (Type == OP_SELL) Price = LastBid;

         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

         ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 && MaxOpenOrders > OrdersTotal()

      // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = LastAsk;

         if (Type == OP_SELL) Price = LastBid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);  

         ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

       || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

        || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

      {

         if (SignalBuy(Symbols[i]) && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbols[i], OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (SignalSell(Symbols[i]) && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbols[i], OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

      }

   }

Код в OnTick после слов и так далее... Написан на MQL4, а тебе нужен MQL5?

На каждый OrderSend условие MaxOpenOrders должен быть не больше OrdersTotal(). 

Код процедур (убрал проверку OrderSymbol()==Symbol() и ввел iClose()/iOpen() вместо Close/Open), правильность кода не проверял:

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

int CountTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

int CountHistTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

bool SignalBuy(string Sym)

{

   for (int i=1; i<=Wait; i++)

   {

      double C = iClose(Sym, PERIOD_M5, i);  // Укажи здесь нужный таймфрейм

      double O = iOpen(Sym, PERIOD_M5, i); 

      if (C > O) return(false);

   }

   if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   return(false);

}

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

bool SignalSell(string Sym)

{

   for (int i=1; i<=Wait; i++)

   {

      double C = iClose(Sym, PERIOD_M5, i);  // Укажи здесь нужный таймфрейм

      double O = iOpen(Sym, PERIOD_M5, i); 

      if (C < O) return(false);

   }

   if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

    && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   return(false);

}

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

datetime TimeLastHistOrder(int type = -1)

{

   datetime lasttime = 0;

   datetime opentime = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > lasttime)

            {

               lasttime = OrderCloseTime();

               opentime = OrderOpenTime();

            }

         }

      }

   }

   return(opentime);

}

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

int TypeLastHistOrder()

{

   datetime time = 0;

   int type = -1;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic)

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               type = OrderType();

            }

         }

      }

   }

   return(type);

}

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

double LotsLastHistOrder(int type = -1)

{

   datetime time = 0;

   double lots = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderOpenTime() > time)

            {

               time = OrderOpenTime();

               lots = OrderLots();

            }

         }

      }

   }

   return(lots);

}

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

double PriceCloseLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderClosePrice();

            }

         }

      }

   }

   return(price);

}

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

double PriceOpenLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderOpenPrice();

            }

         }

      }

   }

   return(price);

} 

 Выдает пару ошибок,  не получилось исправить. Что тут не так?

 

//+------------------------------------------------------------------+
//|                                                          BB1.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             = 1;      // Лот
extern int          Exp              = 1;      // Експирация
extern int          Wait             = 2;      // Количество свечей одного направления
extern int          Timeout          = 1;      // Промежуток времени
extern double       Multiplier       = 3;      // Множитель
extern int          Slippage         = 5;      // Проскальзывание
extern int          Magic            = 774274; // Магик
extern int          MaxOpenOrders    = 1;      // Максимальное количество ордеров

int ticket, Type, SymbolCount;
double Price, Lot;

input string TradeSymbols = "EURUSD_OP, GBPUSD_OP, AUDUSD_OP, NZDUSD_OP, USDCAD_OP, USDCHF_OP, GBPCAD_OP, AUDNZD_OP, CHFJPY_OP, GBPCHF_OP"; // символы для торговли

string Symbols[50]; // 50 -максимально возможное количество символов


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

int OnInit()

{

   if (IsTesting() || !ExtractSymbols())

   {

      SymbolCount = 1;

      Symbols[0] = Symbol();

   }

   return(INIT_SUCCEEDED);

}

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

bool ExtractSymbols()

{

   ushort Comma = StringGetCharacter(",", 0);

   SymbolCount = StringSplit(TradeSymbols, Comma, Symbols);

   for (int i = 0; i < SymbolCount; i++)

   {

      StringToUpper(Symbols[i]);

      Symbols[i] = StringTrimRight(Symbols[i]); // защита от случайных пробелов

      Symbols[i] = StringTrimLeft(Symbols[i]);

   }

   if (SymbolCount > 0) return(true);

   return(false);

}

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

void OnTick()

{

  for (int i=0; i<SymbolCount; i++)

   { 

   if (CountTrades() == 0) // Количество ордеров должно равняться нулю

      {

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) ||

      (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))  && MaxOpenOrders > OrdersTotal())

        // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = LastAsk;

         if (Type == OP_SELL) Price = LastBid;

         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

         ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 && MaxOpenOrders > OrdersTotal()) 

      // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = LastAsk;

         if (Type == OP_SELL) Price = LastBid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);  

         ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

       || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

        || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

      {

         if (SignalBuy(Symbols[i]) && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbols[i], OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (SignalSell(Symbols[i]) && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbols[i], OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

      }

   }


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

int CountTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

int CountHistTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

bool SignalBuy(string Sym)

{

   for (int i=1; i<=Wait; i++)

   {

      double C = iClose(Sym, PERIOD_M5, i);  // Укажи здесь нужный таймфрейм

      double O = iOpen(Sym, PERIOD_M5, i); 

      if (C > O) return(false);

   }

   if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   return(false);

}

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

bool SignalSell(string Sym)

{

   for (int i=1; i<=Wait; i++)

   {

      double C = iClose(Sym, PERIOD_M5, i);  // Укажи здесь нужный таймфрейм

      double O = iOpen(Sym, PERIOD_M5, i); 

      if (C < O) return(false);

   }

   if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

    && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   return(false);

}

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

datetime TimeLastHistOrder(int type = -1)

{

   datetime lasttime = 0;

   datetime opentime = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > lasttime)

            {

               lasttime = OrderCloseTime();

               opentime = OrderOpenTime();

            }

         }

      }

   }

   return(opentime);

}

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

int TypeLastHistOrder()

{

   datetime time = 0;

   int type = -1;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic)

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               type = OrderType();

            }

         }

      }

   }

   return(type);

}

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

double LotsLastHistOrder(int type = -1)

{

   datetime time = 0;

   double lots = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderOpenTime() > time)

            {

               time = OrderOpenTime();

               lots = OrderLots();

            }

         }

      }

   }

   return(lots);

}

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

double PriceCloseLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderClosePrice();

            }

         }

      }

   }

   return(price);

}

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

double PriceOpenLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderOpenPrice();

            }

         }

      }

   }

   return(price);


 
Ребята помогите. Торгую на платформе МТ4 от Stforex. При открытии ордеров, не показывает на графике уровень входа (нету пунктирной линии), и соответственно не удобно выставлять стоп-лосс. Может кто знает в чем дело и как это исправить?
 
gloomy159:
Ребята помогите. Торгую на платформе МТ4 от Stforex. При открытии ордеров, не показывает на графике уровень входа (нету пунктирной линии), и соответственно не удобно выставлять стоп-лосс. Может кто знает в чем дело и как это исправить?

http://prntscr.com/chfa36

Настройки -  графики - Показывать торговые уровни

 

Ребят, какая функция может вернуть ошибку 65 ?

ERR_INVALID_ACCOUNT65Неправильный номер счета
 
testerMT4:

http://prntscr.com/chfa36

Настройки -  графики - Показывать торговые уровни

Эта функция включена была изначально, но уровни все равно не показывает на графике
 
gloomy159:
Эта функция включена была изначально, но уровни все равно не показывает на графике
В настройках цвета проверьте, назначен ли цвет объемам и не совпадает ли с цветом фона.
 
alvlaf:

 Выдает пару ошибок,  не получилось исправить. Что тут не так?

 


Ты забыл добавить закрывающую скобку в OnTick и переменные LastAsk и LastBid. Вот код, который компилируется без ошибок, работоспособность не проверял:

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

//|                                                          BB1.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             = 1;      // Лот

extern int          Exp              = 1;      // Експирация

extern int          Wait             = 2;      // Количество свечей одного направления

extern int          Timeout          = 1;      // Промежуток времени

extern double       Multiplier       = 3;      // Множитель

extern int          Slippage         = 5;      // Проскальзывание

extern int          Magic            = 774274; // Магик

extern int          MaxOpenOrders    = 1;      // Максимальное количество ордеров


int ticket, Type, SymbolCount;

double Price, Lot;

input string TradeSymbols = "EURUSD_OP, GBPUSD_OP, AUDUSD_OP, NZDUSD_OP, USDCAD_OP, USDCHF_OP, GBPCAD_OP, AUDNZD_OP, CHFJPY_OP, GBPCHF_OP"; // символы для торговли

string Symbols[50]; // 50 -максимально возможное количество символов

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

int OnInit()

{

   if (IsTesting() || !ExtractSymbols())

   {

      SymbolCount = 1;

      Symbols[0] = Symbol();

   }

   return(INIT_SUCCEEDED);

}

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

bool ExtractSymbols()

{

   ushort Comma = StringGetCharacter(",", 0);

   SymbolCount = StringSplit(TradeSymbols, Comma, Symbols);

   for (int i = 0; i < SymbolCount; i++)

   {

      StringToUpper(Symbols[i]);

      Symbols[i] = StringTrimRight(Symbols[i]); // защита от случайных пробелов

      Symbols[i] = StringTrimLeft(Symbols[i]);

   }

   if (SymbolCount > 0) return(true);

   return(false);

}

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

void OnTick()

{

   for (int i=0; i<SymbolCount; i++)

   { 

      double LastAsk = SymbolInfoDouble(Symbols[i], SYMBOL_ASK);

      double LastBid = SymbolInfoDouble(Symbols[i], SYMBOL_BID);

      if (CountTrades() == 0) // Количество ордеров должно равняться нулю

      {

         if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY)) ||

         (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))  && MaxOpenOrders > OrdersTotal())

         // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

         {

            Type = TypeLastHistOrder();

            if (Type == OP_BUY)  Price = LastAsk;

            if (Type == OP_SELL) Price = LastBid;

            Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

            ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0 && MaxOpenOrders > OrdersTotal()) 

         // Если прибыль последней сделки равняется нулю, то открывается такая же

         {

            Type = TypeLastHistOrder();

            if (Type == OP_BUY)  Price = LastAsk;

            if (Type == OP_SELL) Price = LastBid;

            Lot = NormalizeDouble(LotsLastHistOrder(), 2);  

            ticket = OrderSend(Symbols[i], Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

         || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

         || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

         {

            if (SignalBuy(Symbols[i]) && MaxOpenOrders > OrdersTotal())

            {

               ticket = OrderSend(Symbols[i], OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

            }

            if (SignalSell(Symbols[i]) && MaxOpenOrders > OrdersTotal())

            {

               ticket = OrderSend(Symbols[i], OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

            }

         }

      }

   }

}

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

int CountTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

int CountHistTrades(int type = -1)

{

   int cnt = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

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

bool SignalBuy(string Sym)

{

   for (int i=1; i<=Wait; i++)

   {

      double C = iClose(Sym, PERIOD_M5, i);  // Укажи здесь нужный таймфрейм

      double O = iOpen(Sym, PERIOD_M5, i); 

      if (C > O) return(false);

   }

   if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   return(false);

}

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

bool SignalSell(string Sym)

{

   for (int i=1; i<=Wait; i++)

   {

      double C = iClose(Sym, PERIOD_M5, i);  // Укажи здесь нужный таймфрейм

      double O = iOpen(Sym, PERIOD_M5, i); 

      if (C < O) return(false);

   }

   if ((iBarShift(Sym, 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

      && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   return(false);

}

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

datetime TimeLastHistOrder(int type = -1)

{

   datetime lasttime = 0;

   datetime opentime = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > lasttime)

            {

               lasttime = OrderCloseTime();

               opentime = OrderOpenTime();

            }

         }

      }

   }

   return(opentime);

}

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

int TypeLastHistOrder()

{

   datetime time = 0;

   int type = -1;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic)

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               type = OrderType();

            }

         }

      }

   }

   return(type);

}

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

double LotsLastHistOrder(int type = -1)

{

   datetime time = 0;

   double lots = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderOpenTime() > time)

            {

               time = OrderOpenTime();

               lots = OrderLots();

            }

         }

      }

   }

   return(lots);

}

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

double PriceCloseLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderClosePrice();

            }

         }

      }

   }

   return(price);

}

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

double PriceOpenLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

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

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderOpenPrice();

            }

         }

      }

   }

   return(price);

 

Здравствуйте!

Как можно определит закрылась позиция по TP? Я не думаю что OrderClosePrice()==OrderTakeProfit() будет правильно использовать.

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