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

 
abeiks:

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

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

В комментарии ордера поискать [tp] если есть...

 
AlexeyVik:

В комментарии ордера поискать [tp] если есть...


Спасибо.
 

Здравствуйте Профи.

помогите исправить ошибку в индикаторе.....

индикатор работает.

сигнал срабатывает на 0-м баре.

но при поступлении других тиков на текущем баре опять срабатывает и дает новые сигналы.

а мне нужно, что при наступлении события Sell или Buy- этот сигнал в кружочка поставился на место текущей цены события, и больше на этом открытом баре никакие события не обрабатывались.

те новых сигналов и кружочков на этом баре не должно быть.

________________________

 

понимаю, что Вы скажете что это полная глупость, ложные сигналы, итд- но мне нужно именно так.

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

_________________________

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

 

Спасибо, и надеюсь кто-нибудь откликнется 

Файлы:
 
alvlaf:

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

 

//+------------------------------------------------------------------+
//|                                                          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);


Александр, стало даже хуже чем было, кроме того что открывает как раньше по два разных инструмента, ещё умудряется открыть одновременно по одному и тому же инструменту несколько позиций.  Где то мы с тобой немного  перемудрили.
 

Помогите, пожалуйста, торговать на новостях. Очень нужен советник, у которого должны быть две основные функции. 

Первая функция: выставление отложенных ордеров с заданным TP и SL, в заданное время на заданном уровне от цены.
Вторая функция: Держать отложки параллельно цене. Т.е, передвигать их вместе с ценой (руками так муторно это делать). И, в заданное время, во время выхода новости останавливать сие действие и ждать, когда цена заденет один из ордеров. Второй ордер после этого сразу же удаляется. 

Ещё раз:
За 2 минуты до новости ставятся два противоположных stop-ордера на расстоянии 10 пунктов от цены, сразу же включается функция передвижения параллельно цены, 2 минуты передвигаться вместе с ценой, один ордер убегает от цены, второй догоняет цену. Во время выхода новости выключить функцию передвижения отложки и далее ждать пробоя одного из ордеров. Второй после пробоя первого сразу же удаляется. 

Изменяемые в свойствах советника переменные (примерно, как я себе представляю, не знаю, какая на самом деле реализация):

TP - 600 (по умолчанию)

Trall - 300 (по умолчанию)

SL - 100 (по умолчанию)

Pips - 100 (расстояние от цены по умолчанию)

Slippage - 100 (проскальзывание в пунктах по умолчанию)

Lot - 0,1

Risk - 10 // процентов (ну, это не обязательно, потом попрошу, если что)

TimeNews1On - true (использовать ячейки ниже для ввода времени, false - советник не торгует их)

TimeNewsHour - часы (время выхода новости 1)

TimeNewsMin - минуты (время выхода новости 1)

TimeNews2On - false (по умолчанию)

TimeNewsHour - часы (время выхода новости 2)

TimeNewsMin - минуты (время выхода новости 2)

TimeNews3On - false

TimeNewsHour - часы (время выхода новости 3)

TimeNewsMin - минуты (время выхода новости 3)

TimeNews4On - false

TimeNewsHour - часы (время выхода новости 4)

TimeNewsMin - минуты (время выхода новости 4)

TimeNews5On - false

TimeNewsHour - часы (время выхода новости 5)

TimeNewsMin - минуты (время выхода новости 5)


Инста, пятизнак


Я всё это делаю вручную, муторно так, а теперь ещё и времени нет отрабатывать новости, хочу с утра или ночью поставить советник на пары, где в этот день будут новости, чтобы все они отработались. 
--------------------------------------

Если знаете такие советники, встречали, то прошу поделиться

Заранее спасибо вам!

 
alvlaf:

Вернемся обратно к твоему исходному коду. Попробуй вот так:

int OnInit()

{

   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);

   return(INIT_SUCCEEDED);

}

void  OnDeInit()

{

   GlobalVariableSet("AllowNewOrders",1); 

void OnTick()

{

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

   {

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

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

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

      {

         GlobalVariableSet("AllowNewOrders", 0);

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

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

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

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

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

      {

         GlobalVariableSet("AllowNewOrders", 0);

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);

         ticket = OrderSend(Symbol(), 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 (GlobalVariableGet("AllowNewOrders") > 0) return;

         if (SignalBuy() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);

         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal())

         {

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

            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);

         }

      }

   }

Не проверял, потому что не пойму каким образом несколько копий советника с общим ограничением в 1 ордер будут определять, на каком символе (после профитной серии) лучше начать торговлю?

 
BooGUY:


Помогите, пожалуйста, торговать на новостях. Очень нужен советник, у которого должны быть две основные функции. 

Первая функция: выставление отложенных ордеров с заданным TP и SL, в заданное время на заданном уровне от цены.
Вторая функция: Держать отложки параллельно цене. Т.е, передвигать их вместе с ценой (руками так муторно это делать). И, в заданное время, во время выхода новости останавливать сие действие и ждать, когда цена заденет один из ордеров. Второй ордер после этого сразу же удаляется. 

Ещё раз:
За 2 минуты до новости ставятся два противоположных stop-ордера на расстоянии 10 пунктов от цены, сразу же включается функция передвижения параллельно цены, 2 минуты передвигаться вместе с ценой, один ордер убегает от цены, второй догоняет цену. Во время выхода новости выключить функцию передвижения отложки и далее ждать пробоя одного из ордеров. Второй после пробоя первого сразу же удаляется. 

Если знаете такие советники, встречали, то прошу поделиться


Заранее спасибо вам!

Я тебе могу скину код для чтения данных новостей из файла, может пригодится. Раз в неделю заглядываешь в экономический календарь, заносишь данные в файл папка_с_терминалом\MQL4\Files\novosti.txt тех новостей, на которые стоит обратить внимание, советник можешь включать даже непосредственно перед новостью (можно таким советником начало, например, американской сессии отслеживать - вдруг сильное движение будет). Код в части торговли у меня так и не доработан, поскольку пару раз на новостях меня серьезно "кинули" :))   Последняя версия ставит аж шесть ордеров (3 buy stop + 3 sell stop) на разном расстоянии с разным тейкпрофитом... В общем новостной код рабочий, а торговый надо дорабатывать.

#property strict

input string   NewsFilename  = "novosti.txt";         // Имя текстового файла с новостями

input int      MinutesBefore = 5;                     // За сколько минут до выхода новости ставить ордера

input int      MinutesAfter1 = 15;                    // Через сколько минут после выхода новости удалить ордера 1 группы

input int      MinutesAfter2 = 30;                    // Через сколько минут после выхода новости удалить ордера 2 группы

input int      MinutesAfter3 = 30;                    // Через сколько минут после выхода новости удалить ордера 3 группы

input int      PriceIndent1  = 15;                    // Отступ от цены в пунктах

input int      PriceIndent2  = 5;                     // Отступ от предыдущего тейкпрофита в пунктах

input int      TakeProfit1   = 40;                    // Размер тейкпрофита для 1 группы в пунктах

input int      TakeProfit2   = 60;                    // Размер тейкпрофита для 2 группы в пунктах

input int      TakeProfit3   = 100;                   // Размер тейкпрофита для 3 группы в пунктах

input int      StopLoss      = 20;                    // Размер стоплосса для всех ордеров в пунктах

input double   Multiplier1   = 1.0;                   // Коэффициент к лоту ордеров 2 группы

input double   Multiplier2   = 2.0;                   // Коэффициент к лоту ордеров 3 группы

input int      MaximalRisk   = 10;                    // Максимальный риск в процентах

//====================================================================================================

datetime Times[200], LastTime;

string Symbols[200];

bool NewsPassed[200];

int NewsCount;

//====================================================================================================

int OnInit()

{

   // Загрузка свежих новостей

   if (!LoadNews()) return(INIT_FAILED);

   return(INIT_SUCCEEDED);

}

//====================================================================================================

void OnTick()

{

   if (!IsTradeAllowed()) return;

   datetime TestTime = iTime(Symbol(), PERIOD_H1, 0);

   // Обновление новостей в начале каждого дня

   if (TimeDay(TestTime) != TimeDay(LastTime))

   {

      LastTime = TestTime;

      if (!LoadNews())

      {

         Alert("Ошибка обновления новостей!");

         return;

      }

   }

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

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

   {

      // До выхода новости ставить ордера на пробой

      if (Times[i] > TimeCurrent() && Times[i] - TimeCurrent() <= MinutesBefore * 60 && !NewsPassed[i])

      {

         PrintFormat("Текущее время - %s, пора ставить ордера по валюте - %s", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES), Symbols[i]);

         SetupOrders(Symbols[i]);

         NewsPassed[i] = true;

      }

   }

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

}

//====================================================================================================

bool LoadNews()

{

   int Count, Tick = 0;

   string Str, Data[40];

   ResetLastError(); 

   if (!FileIsExist(NewsFilename, 0))

   {

      PrintFormat("Файла новостей %s не существует.", NewsFilename);

      Print("Файл должен находится в папке \\MQL4\\Files, при тестировании - в папке \\Tester\\Files.");

      return(false);

   }

   int Handle = FileOpen(NewsFilename, FILE_READ|FILE_SHARE_READ|FILE_TXT); 

   if (Handle != INVALID_HANDLE) 

   { 

      while (!FileIsEnding(Handle))

      {

         Str = FileReadString(Handle);

         Count = StringSplit(Str, StringGetChar(" ", 0), Data);

         for (int i = 1; i < Count; i = i + 2)

         {

            Times[Tick] = StringToTime(Data[0] + " " + Data[i]);

            Symbols[Tick] = Data[i + 1];

            Tick++;

         }

      }

      FileClose(Handle);

      NewsCount = Tick;

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

      {

        if (Times[i] > TimeCurrent()) NewsPassed[i] = false;

        else NewsPassed[i] = false;

      }

      PrintFormat("Количество новостей загружено - %i.", NewsCount);

      return(true);

   }

   PrintFormat("Не удается открыть файл %s. Код ошибки %d.", NewsFilename, GetLastError());

   return(false);

}

//====================================================================================================

void SetupOrders(string Sym)

{

   int Ticket, Dig, Count;

   double Price, TP, SL, Lot;

   datetime KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

   string SymList[7];

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

   if (Sym == "AUD")

   {

      SymList[0] = "AUDCAD";  SymList[1] = "AUDCHF";  SymList[2] = "AUDJPY";  SymList[3] = "AUDNZD";

      SymList[4] = "AUDUSD";  SymList[5] = "EURAUD";  SymList[6] = "GBPAUD";

   }

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

   if (Sym == "CAD")

   {

      SymList[0] = "AUDCAD";  SymList[1] = "CADCHF";  SymList[2] = "CADJPY";  SymList[3] = "EURCAD";

      SymList[4] = "GBPCAD";  SymList[5] = "NZDCAD";  SymList[6] = "USDCAD";

   }

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

   if (Sym == "CHF")

   {

      SymList[0] = "AUDCHF";  SymList[1] = "CADCHF";  SymList[2] = "EURCHF";  SymList[3] = "GBPCHF";

      SymList[4] = "CHFJPY";  SymList[5] = "NZDCHF";  SymList[6] = "USDCHF";

   }

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

   if (Sym == "EUR")

   {

      SymList[0] = "EURAUD";  SymList[1] = "EURCAD";   SymList[2] = "EURCHF";  SymList[3] = "EURGBP";

      SymList[4] = "EURJPY";  SymList[5] = "EURNZD";   SymList[6] = "EURUSD";

   }

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

   if (Sym == "GBP")

   {

      SymList[0] = "EURGBP";  SymList[1] = "GBPAUD";  SymList[2] = "GBPCAD";  SymList[3] = "GBPCHF";

      SymList[4] = "GBPJPY";  SymList[5] = "GBPNZD";  SymList[6] = "GBPUSD";

   }

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

   if (Sym == "JPY")

   {

      SymList[0] = "AUDJPY";  SymList[1] = "CADJPY";  SymList[2] = "CHFJPY";  SymList[3] = "EURJPY";

      SymList[4] = "GBPJPY";  SymList[5] = "NZDJPY";  SymList[6] = "USDJPY";

   }

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

   if (Sym == "NZD")

   {

      SymList[0] = "AUDNZD";  SymList[1] = "EURNZD";  SymList[2] = "GBPNZD";  SymList[3] = "NZDCAD";

      SymList[4] = "NZDCHF";  SymList[5] = "NZDJPY";  SymList[6] = "NZDUSD";

   }

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

   if (Sym == "USD")

   {

      SymList[0] = "AUSUSD";  SymList[1] = "EURUSD";  SymList[2] = "GBPUSD";  SymList[3] = "NZDUSD";

      SymList[4] = "USDCAD";  SymList[5] = "USDCHF";  SymList[6] = "USDJPY";

   }

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

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

   {

      Count = 0;

      Dig = int(MarketInfo(SymList[i], MODE_DIGITS));

      Lot = NormalizeDouble(0.01, 2);

      // Покупка

      KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

      Price = NormalizeDouble(MarketInfo(SymList[i], MODE_ASK) + PriceIndent1 / pow(10, Dig-1), Dig);

      TP = NormalizeDouble(Price + TakeProfit1 / pow(10, Dig-1), Dig);

      SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);

      Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);

      if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot);

      KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;

      Price = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig);

      TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig);

      SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);

      Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot * Multiplier1, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);

      if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1);

      KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;

      Price = NormalizeDouble(TP + PriceIndent2 / pow(10, Dig-1), Dig);

      TP = NormalizeDouble(Price + TakeProfit2 / pow(10, Dig-1), Dig);

      SL = NormalizeDouble(Price - StopLoss / pow(10, Dig-1), Dig);

      Ticket = OrderSend(SymList[i], OP_BUYSTOP, Lot*Multiplier2, Price, 5, SL, TP, NULL, 0, KeepAlive, clrLimeGreen);

      if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier2);

      // Продажа

      KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter1) * 60;

      Price = NormalizeDouble(MarketInfo(SymList[i], MODE_BID) - PriceIndent1 / pow(10, Dig-1), Dig);

      TP = NormalizeDouble(Price - TakeProfit1 / pow(10, Dig-1), Dig);

      SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);

      Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);

      if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot);

      KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter2) * 60;

      Price = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig);

      TP = NormalizeDouble(Price - TakeProfit2 / pow(10, Dig-1), Dig);

      SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);

      Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);

      if (Ticket > 0) Count++; else PrintFormat("Ошибка при создании ордера %i, символ %s, цена %f, тейк %f, стоп %f, лот %f.", GetLastError(), SymList[i], Price, TP, SL, Lot*Multiplier1);

      KeepAlive = TimeCurrent() + (MinutesBefore + MinutesAfter3) * 60;

      Price = NormalizeDouble(TP - PriceIndent2 / pow(10, Dig-1), Dig);

      TP = NormalizeDouble(Price - TakeProfit3 / pow(10, Dig-1), Dig);

      SL = NormalizeDouble(Price + StopLoss / pow(10, Dig-1), Dig);

      Ticket = OrderSend(SymList[i], OP_SELLSTOP, Lot, Price, 5, SL, TP, NULL, 0, KeepAlive, clrOrangeRed);

      PrintFormat("По символу %s выставлено %i ордеров.", SymList[i], Count);0   }

}

Файл новостей выглядит так:

15.09.2016 01:45 NZD 04:30 AUD 10:30 CHF 14:00 GBP 15:30 USD

16.09.2016 15:30 USD 17:00 USD

и так далее... 

 
A13ksandr:

Вернемся обратно к твоему исходному коду. Попробуй вот так:

int OnInit()

{

   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);

   return(INIT_SUCCEEDED);

}

void  OnDeInit()

{

   GlobalVariableSet("AllowNewOrders",1); 

void OnTick()

{

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

   {

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

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

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

      {

         GlobalVariableSet("AllowNewOrders", 0);

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

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

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

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

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

      {

         GlobalVariableSet("AllowNewOrders", 0);

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);

         ticket = OrderSend(Symbol(), 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 (GlobalVariableGet("AllowNewOrders") > 0) return;

         if (SignalBuy() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);

         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal())

         {

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

            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);

         }

      }

   }

Не проверял, потому что не пойму каким образом несколько копий советника с общим ограничением в 1 ордер будут определять, на каком символе (после профитной серии) лучше начать торговлю?

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

Тот последний код, который ты дал это уже шаг в перед - он не открывает вообще  ни одной сделки (значит запрет действует). Пока не понял почему вообще ни одной. В приложении скрин журнала.

 

Может уже пора научится как вставлять код?!

int OnInit()

{

   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);

   return(INIT_SUCCEEDED);

}

void  OnDeInit()

{

   GlobalVariableSet("AllowNewOrders",1); 

} 

void OnTick()

{

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

   {

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

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

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

      {

         GlobalVariableSet("AllowNewOrders", 0);

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

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

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

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

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

      {

         GlobalVariableSet("AllowNewOrders", 0);

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);

         ticket = OrderSend(Symbol(), 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 (GlobalVariableGet("AllowNewOrders") > 0) return;

         if (SignalBuy() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);

         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal())

         {

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

            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);

         }

      }

   }

} 
 
abeiks:  Может уже пора научится как вставлять код?!
int OnInit()                     // ИХМО так нагляднее
{
   if (!GlobalVariableCheck("AllowNewOrders")) GlobalVariableSet("AllowNewOrders",1);
   return(INIT_SUCCEEDED);
}

void  OnDeInit()
{
   GlobalVariableSet("AllowNewOrders",1); 
} 

void OnTick()
{
   if (CountTrades() == 0) // Количество ордеров должно равняться нулю
   {
      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))
      || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))
      // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);
         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);
      }

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

      // Если прибыль последней сделки равняется нулю, то открывается такая же
      {
         GlobalVariableSet("AllowNewOrders", 0);
         Type = TypeLastHistOrder();
         if (Type == OP_BUY)  Price = Ask;
         if (Type == OP_SELL) Price = Bid;
         Lot = NormalizeDouble(LotsLastHistOrder(), 2);
         ticket = OrderSend(Symbol(), 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 (GlobalVariableGet("AllowNewOrders") > 0) return;
         if (SignalBuy() && MaxOpenOrders > OrdersTotal())
         {
            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);
            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal())
         {
            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);
            if (ticket>0) GlobalVariableSet("AllowNewOrders", 0);
         }
      }
   }
}