Скачать MetaTrader 5

Странно работает цикл for в MT4

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

Как в цикле for получить значения лотов на Buy и Sell, чтобы в условиях на Buy: if(SellOpenLots == BuyPendingLots || SellOpenLots > BuyPendingLots) и Sell: if(BuyOpenLots == SellPendingLots || BuyOpenLots > SellPendingLots)

ставился один ордер противоположного объема в 2 раза больше + шаг и не генерировались лишние лоты, которые приходят из цикла?

Кусок кода:

//Константы

extern double Lot           = 0.01; //Размер начального лота (0.01 - для 300$, 0.02 - 1000$)
extern double StepLot       = 0.02; //Шаг добавление последующих лотов
extern uchar  Turns         = 5; //Количество разворотных сделок
extern int    LineStart     = 50; //Уровень начала открытия ордеров в пунктах
extern int    LineLosure    = 120; //Уровень конца открытия ордеров в пунктах
extern int    TrailingStart = 150; //Уровень начала трейлинга открытых ордеров в пунктах
extern int    TrailingStop  = 40; //Минимально допустимый уровень стоплосса в пунктах
extern uchar  Slip          = 3; //Уровень проскальзывания цены в случае, если ДЦ запросит реквоты (в последний момент немного поменяет цену)
extern uchar  MagicNumber   = 125; //Волшебное число помогает советнику отличить свои ордера от других
extern string file          = "info.txt"; //Создать пустой файл

//Объявление переменных
double BuyPrice, SellPrice, NewBuyOpenLots, NewSellOpenLots, NewBuyPendingLots, NewSellPendingLots, PendingOrder, BuyOpenPrice, SellOpenPrice,
       BuyOpenLots, SellOpenLots, BuyPendingLots, SellPendingLots, NumberLots, OpenPrice, StopLoss, NewStopLoss, FullStopLoss;
uchar  AllOrders, OpenOrders, PendingOrders;
int    handle, i;
bool   PreviousOrder, LastOrder;

//-----------------------------------------------------------------------------------------------------------------------------------------------------
//Инициализация параметров эксперта
int init()
{
  return(0);
}

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

int start()
{
  //Считываем цены начала торгов
  handle = FileOpen(file, FILE_READ|FILE_CSV, ";"); //Открытие файла для чтения
  if(handle > 0)
  {
    BuyPrice = StringToDouble(FileReadString(handle)); //Считывание строки из файла и преобразование строки в вещественные тип
    SellPrice = StringToDouble(FileReadString(handle)); //Считывание строки из файла и преобразование строки в вещественные тип
    FileClose(handle); //закрытие файла
  }
  else
  {
    Alert("Ошибка при открытии на чтение файла. Возможно, файл отсутствует или занят другим приложением");
    return(0);
  }
  
  //Подсчитываем количество всех и отложенных ордеров
  AllOrders = 0; OpenOrders = 0; PendingOrders = 0; BuyOpenLots = 0; SellOpenLots = 0; BuyPendingLots = 0; SellPendingLots = 0;
  for(i = 0; i <= OrdersTotal(); i++)
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
  {
    AllOrders ++; //Количество всех ордеров
    if(BuyPrice > 0 && SellPrice > 0)
    {
      BuyOpenPrice = NormalizeDouble(BuyPrice + LineLosure * Point, Digits); //Цена конца зоны торговли сделок на Buy
      SellOpenPrice = NormalizeDouble(SellPrice - LineLosure * Point, Digits); //Цена конца зоны торговли сделок на Sell
      if(OrderOpenPrice() < BuyOpenPrice && OrderOpenPrice() > SellOpenPrice)
      {
        if(OrderType() == OP_BUY) BuyOpenLots += OrderLots(); //Количество открытых лотов на Buy
        if(OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP) BuyPendingLots += OrderLots(); //Количество отложенных лотов на Buy
        if(OrderType() == OP_SELL) SellOpenLots += OrderLots(); //Количество открытых лотов на Sell
        if(OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP) SellPendingLots += OrderLots(); //Количество отложенных лотов на Sell
        if(OrderType() == OP_BUY || OrderType() == OP_SELL) OpenOrders ++; //Количество открытых ордеров
        if(OrderType() == OP_BUYLIMIT || OrderType() == OP_BUYSTOP
        || OrderType() == OP_SELLLIMIT || OrderType() == OP_SELLSTOP)
        PendingOrders ++; //Количество отложенных ордеров
      }
    }
  }
  
  //Удаляем цены начала торгов и количества всех ордеров при условии если нет открытых ордеров
  if(BuyPrice + SellPrice > 0 && AllOrders == 0)
  {
    //Удаляем цены начала торгов
    handle=FileOpen(file, FILE_WRITE|FILE_CSV, ";"); //Открытие файла для записи
    if(handle > 0)
    {
      FileWrite(handle, "", ""); //Запись цен открытия торговли и количества всех ордеров в файл
      FileClose(handle); //закрытие файла
    }
    else
    {
      Alert("Ошибка при открытии на запись файла. Возможно, файл отсутствует или занят другим приложением");
      return(0);
    }
  }
  
  //Открываем начальные сделки при условии если не записана цена в файл и нет открытых ордеров, то записываем
  //новые цены и количество всех ордеров
  if(BuyPrice + SellPrice == 0 && AllOrders == 0)
  {
    //Запись цены начала торгов
    handle=FileOpen(file, FILE_WRITE|FILE_CSV, ";"); //Открытие файла для записи
    if(handle > 0)
    {
      BuyOpenPrice = NormalizeDouble(Ask + LineStart * Point, Digits); //Цена открытия сделок на Buy
      SellOpenPrice = NormalizeDouble(Bid - LineStart * Point, Digits); //Цена открытия сделок на Sell
      //Открытие начального отложенного ордера на BuyLimit
      if(OrderSend(Symbol(), OP_BUYLIMIT, Lot, BuyOpenPrice, Slip, 0, 0, NULL, MagicNumber, 0, clrBlue) == -1)
      {
        Print("Ошибка открытия ордера: B1 ", GetLastError());
        if(OrderSend(Symbol(), OP_BUYSTOP, Lot, BuyOpenPrice, Slip, 0, 0, NULL, MagicNumber, 0, clrBlue) == -1)
        Print("Ошибка открытия ордера: B2 ", GetLastError());
      }
      //Открытие начального отложенного ордера на SellLimit
      if(OrderSend(Symbol(), OP_SELLLIMIT, Lot, SellOpenPrice, Slip, 0, 0, NULL, MagicNumber, 0, clrRed) == -1)
      {
        Print("Ошибка открытия ордера: S1 ", GetLastError());
        if(OrderSend(Symbol(), OP_SELLSTOP, Lot, SellOpenPrice, Slip, 0, 0, NULL, MagicNumber, 0, clrRed) == -1)
        Print("Ошибка открытия ордера: S2 ", GetLastError());
      }

      FileWrite(handle, Ask, Bid); //Запись цен открытия торговли и количества всех ордеров в файл
      FileClose(handle); //закрытие файла
    }
    else
    {
      Alert("Ошибка при открытии на запись файла. Возможно, файл отсутствует или занят другим приложением");
      return(0);
    }
  }
  
  //Открываем новые поворотные сделки при условии если отсутствуют отложенные ордера
  if(OpenOrders >= 1 && PendingOrders < Turns)
  {
    if(SellOpenLots == BuyPendingLots || SellOpenLots > BuyPendingLots)
    {
      NumberLots = BuyOpenLots + BuyOpenLots - SellOpenLots + StepLot; //Расчет следующего лота для отложенного ордера
      BuyOpenPrice = NormalizeDouble(BuyPrice + LineStart * Point, Digits); //Цена открытия сделок на Buy
      Print("Buy");
      //Открытие начального отложенного ордера на BuyLimit
      if(OrderSend(Symbol(), OP_BUYLIMIT, NumberLots, BuyOpenPrice, Slip, 0, 0, NULL, MagicNumber, 0, clrBlue) == -1)
      {
        Print("Ошибка открытия ордера: B3 ", GetLastError());
        if(OrderSend(Symbol(), OP_BUYSTOP, NumberLots, BuyOpenPrice, Slip, 0, 0, NULL, MagicNumber, 0, clrBlue) == -1)
        Print("Ошибка открытия ордера: B4 ", GetLastError());
      }
    }
    if(BuyOpenLots == SellPendingLots || BuyOpenLots > SellPendingLots)
    {
      NumberLots = SellOpenLots + SellOpenLots - BuyOpenLots + StepLot; //Расчет следующего лота для отложенного ордера
      SellOpenPrice = NormalizeDouble(SellPrice - LineStart * Point, Digits); //Цена открытия сделок на Sell
      Print("Sell");
      //Открытие начального отложенного ордера на SellLimit
      if(OrderSend(Symbol(), OP_SELLLIMIT, NumberLots, SellOpenPrice, Slip, 0, 0, NULL, MagicNumber, 0, clrRed) == -1)
      {
        Print("Ошибка открытия ордера: S3 ", GetLastError());
        if(OrderSend(Symbol(), OP_SELLSTOP, NumberLots, SellOpenPrice, Slip, 0, 0, NULL, MagicNumber, 0, clrRed) == -1)
        Print("Ошибка открытия ордера: S4 ", GetLastError());
      }
    }
    }
  }
  return(0);
}

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

//Закрытие параметров эксперта
int deinit()
{
  return (0);
}

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

Тест стратегии в MT4


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