0
Посмотрите уже написанный Вами советник Corel.mq5
strategy.opentraders.ru/28779.html.
Там почти все есть. Надо только добавить магиги для групп.
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Копируем значения индикатора MA используя хэндлы
   if(CopyBuffer(EURUSD_MA_Handle,0,0,MAPeriod,EURUSD)<0 || CopyBuffer(GBPUSD_MA_Handle,0,0,MAPeriod,GBPUSD)<0)
     {
      Alert("Ошибка копирования буферов индикатора Bollinger Bands - номер ошибки:",GetLastError(),"!");
      return;
     }
     
// Лучшее предложение на покупку
   double Ask1=SymbolInfoDouble(Symb1,SYMBOL_ASK);
   double Ask2=SymbolInfoDouble(Symb2,SYMBOL_ASK);
// Лучшее предложение на продажу                           
   double Bid1=SymbolInfoDouble(Symb1,SYMBOL_BID);
   double Bid2=SymbolInfoDouble(Symb2,SYMBOL_BID);
   
   double BALANCE=0, EQUITY=0, Prosadka=0;
//--- Профит
   double pr=0,pr1=0,pr2=0;
//Открытие двух позиций по разным символам
   if(PositionsTotal()<1)
     {
      trade.PositionOpen(Symb1,ORDER_TYPE_BUY,Lot,Ask1,0,0);
      trade.PositionOpen(Symb2,ORDER_TYPE_SELL,Lot,Bid2,0,0);
     }
//Профит по первому символу
   pr1=SymbProfit(Symb1);
//Профит по первому символу   
   pr2=SymbProfit(Symb2);
// Общий профит    
   pr=pr1+pr2;

//Если профит больше значения в настройках
   if(pr>Profit)
     {
      // Закрываем обе позиции
      trade.PositionClose(Symb1);
      trade.PositionClose(Symb2);
     }

   if(Stop>0)
     {
      BALANCE=AccountInfoDouble(ACCOUNT_BALANCE);
      EQUITY=AccountInfoDouble(ACCOUNT_EQUITY);
      Prosadka=100*(BALANCE-EQUITY)/BALANCE;
        {
         if(Prosadka>=Stop)
           {
            // Закрываем обе позиции
            trade.PositionClose(Symb1);
            trade.PositionClose(Symb2);
           }
        }
     }

void OnTick() можно обозвать void Trade1() и сделать как функцию.Аналогично создать функцию void Trade2() со своим магиком и своими парами.
Потом свести их в void OnTick().
Просто мт5 для меня вообще «темный лес».
Посмотрите.Может решитесь.Усреднение делать не надо, но если будет буду только рад.
avatar

ssg

  • 7 августа 2020, 04:02
0
А без усреднения позиций возьметесь?
avatar

ssg

  • 6 августа 2020, 04:01
0
Спасибо, подожду.
Если не затруднит добавьте усреднение позиций.
Вы выполняли заказ, правда для одной пары.
http://zakaz.opentraders.ru/47394.html
Просьба написать советник для платформы мт5!
avatar

ssg

  • 5 августа 2020, 20:38
0
А может отвязаться от времени и проверку делать опираясь на цену открытия последней позиции?
avatar

ssg

  • 5 августа 2020, 20:31
0
Вообще библиотека Кима мне очень помогает:
//+----------------------------------------------------------------------------+
//|                                                           b-Positions.mqh  |
//|                                                                            |
//|                                                    Ким Игорь В. aka KimIV  |
//|                                                       http://www.kimiv.ru  |
//|                                                                            |
//|  08.11.2006  Библиотека функций для работы с позициями.                    |
//+----------------------------------------------------------------------------+
#property library

// ClosePosBySelect                Закрытие одной предварительно выбранной позиции
// ClosePosBySizeLossInCurrency    Закрытие тех позиций, у которых убыток в валюте депозита превысил некоторое значение
// ClosePosBySizeProfitInCurrency  Закрытие тех позиций, у которых профит в валюте депозита превысил некоторое значение
// ClosePosBySortLots              Закрытие позиций в порядке сортировки по размерам лотов
// ClosePosExceptTicket            Закрытие позиций по рыночной цене за исключением одной с переданным тикетом
// ClosePosFirstProfit             Закрытие позиций по рыночной цене сначала прибыльных
// ClosePositions                  Закрытие позиций по рыночной цене
// ClosePosWithMaxProfitInCurrency Закрытие позиции с максимальным положительным профитом в валюте депозита
// DistMarketAndPos                Расстояние в пунктах между рынком и ближайшей позицей
// ExistInHistoryCloseBetween      Существование в истории позиции или ордера, закрытой (удалённого) между датами.
// ExistInHistoryOpenBetween       Существование в истории позиции или ордера, открытой (установленного) между датами.
// ExistInHistoryToDay      Существование ордера или позиции в истории за сегодня
// ExistOPNearMarket        Существование позиции или ордера около рынка
// ExistPosByPrice          Существование позиций по цене открытия
// ExistPositions           Существование позиций
// GetAmountLotFromOpenPos  Сумма лотов открытых позиций
// GetIndexLastPos          Индекс последней открытой позиции или -1
// GetLotLastClosePos       Возвращает размер лота последней закрытой позиции или -1
// GetLotLastPos            Возвращает размер лота последней открытой позиции или -1
// GetMaxLotFromOpenPos         Максимальный размер лота из открытых позиций
// GetMinLotFromOpenPos         Минимальный размер лота из открытых позиций
// GetProfitFromDateInCurrency  Суммарный профит в валюте депозита закрытых с определённой даты позиций
// GetProfitOpenPosInCurrency   Суммарный профит открытых позиций в валюте депозита
// GetProfitOpenPosInPoint      Суммарный профит открытых позиций в пунктах
// GetTicketLastPos             Тикет последней открытой позиции или -1
// GetTypeLastClosePos      Тип последней закрытой позиции или -1
// GetTypeLastOpenPos       Тип последней открытой позиции или -1
// isCloseLastPosByStop     Флаг закрытия последней позиции по стопу
// isCloseLastPosByTake     Флаг закрытия последней позиции по тейку
// isLossLastPos            Флаг убыточности последней позиции
// isTradeToDay             Возвращает флаг торгов сегодня
// MovingInWL               Перенос уровня стопа в безубыток
// NumberOfBarCloseLastPos  Номер бара закрытия последней позиции или -1
// NumberOfBarOpenLastPos   Номер бара открытия последней позиции или -1
// NumberOfLossPosToday     Количество убыточных позиций, закрытых сегодня
// NumberOfPositions        Количество позиций
// OpenPosition             Открытие позиции
// PriceCloseLastPos        Цена закрытия последней закрытой позиций
// PriceOpenLastClosePos    Цена открытия последней закрытой позиций
// PriceOpenLastPos         Цена открытия последней открытой позиций
// PriceOpenNearPos         Цена открытия ближайшей позиции
// SecondsAfterCloseLastPos Количество секунд после закрытия последней позиций
// SecondsAfterOpenLastPos  Количество секунд после открытия последней позиций
// SimpleTrailing           Сопровождение позиций простым тралом
// TakeProfitLastClosePos   Возвращает цену TakeProfit последней закрытой позиций или -1
// TakeProfitLastPos        Возвращает цену TakeProfit последней открытой позиций или -1
// TicketNearPos            Тикет ближайшей к рынку позиции по цене открытия или 0
// TimeOpenLastPos          Время открытия последней открытой позиций
// TypeNearPos              Возвращает тип ближайшей к рынку позиции или -1
avatar

ssg

  • 5 августа 2020, 17:32
0
Я же писал — это шаблон, нужна доработка.
Можно в разных советниках ставить разное время ожидания Sleep(1000);
Что касается перебора ордеров, то перебираю с конца только при закрытии позиций.
Вот еще одна функция Кима, может пригодиться:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает время открытия последней открытой позиций.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime TimeOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(t);
}
avatar

ssg

  • 5 августа 2020, 17:30
0
Да, проглядел что нет повторной попытки открытия.Хотя меня эта функция ни разу не подвела.
Тогда простой вариант вариант (можно использовать как заготовку)
//-------------------------------------------------------------------------
bool SendOrder(int tip, double lot, string com)
{
   for (int i=0; i<OrdersTotal(); i++) 
   {  
      if (OrderSelect(i, SELECT_BY_POS))
      {  
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
            if (OrderComment()==com) return(0);
         }
      }
   }
   int error,nn;
   while(true)
   {
      RefreshRates();
      if (tip==OP_BUY) error = OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slippage,0,0,com,Magic,0,Blue);
      
      if (tip==OP_SELL) error = OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slippage,0,0,com,Magic,0,Red);
      
      if (error==-1)
      {
         Print("OrderSend Error ",GetLastError()," Lot ",lot);
         Sleep(1000);
      }
      else return(1);
      nn++;
      if (nn>10) return(0);
   }
   return(1);
}
//-------------------------------------------------------------------

avatar

ssg

  • 5 августа 2020, 16:24
0
Может функция Кима поможет:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.04.2008                                                     |
//|  Описание : Открывает позицию по рыночной цене.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - MagicNumber                                                        |
//|    co - комментарий                                                        |
//+----------------------------------------------------------------------------+
void OpenPosition(string sy, int op, double ll, double sl=0, double tp=0, int mn=0, string co="") {
  color    clOpen;
  datetime ot;
  double   pp, pa, pb;
  int      dg, err, it, ticket=0;

  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUY) clOpen=clOpenBuy; else clOpen=clOpenSell;
  if (co=="") co=WindowExpertName()+" "+GetNameTF(Period());
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("OpenPosition(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    dg=MarketInfo(sy, MODE_DIGITS);
    pa=MarketInfo(sy, MODE_ASK);
    pb=MarketInfo(sy, MODE_BID);
    if (op==OP_BUY) pp=pa; else pp=pb;
    pp=NormalizeDouble(pp, dg);
    ot=TimeCurrent();
    if (MarketWatch)
      ticket=OrderSend(sy, op, ll, pp, Slippage, 0, 0, co, mn, 0, clOpen);
    else
      ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, 0, clOpen);
    if (ticket>0) {
      if (UseSound) PlaySound(SoundSuccess); break;
    } else {
      err=GetLastError();
      if (UseSound) PlaySound(SoundError);
      if (pa==0 && pb==0) Message("Проверьте в Обзоре рынка наличие символа "+sy);
      // Вывод сообщения об ошибке
      Print("Error(",err,") opening position: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa," Bid=",pb," sy=",sy," ll=",ll," op=",GetNameOP(op),
            " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66.666);
        if (ExistPositions(sy, op, mn, ot)) {
          if (UseSound) PlaySound(SoundSuccess); break;
        }
      }
      if (err==140 || err==148 || err==4110 || err==4111) break;
      if (err==141) Sleep(1000*100);
      if (err==145) Sleep(1000*17);
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      if (err!=135 && err!=138) Sleep(1000*7.7);
    }
  }
  if (MarketWatch && ticket>0 && (sl>0 || tp>0)) {
    if (OrderSelect(ticket, SELECT_BY_TICKET)) ModifyOrder(-1, sl, tp);
  }
}
avatar

ssg

  • 5 августа 2020, 15:03
0
Добрый день.
Андрей, конечно спасибо за советник, но на МТ4 я сам написал себе.
Стоит на демо, но не могу подобрать параметры и пары для работы.
Я просил написать советник на МТ5, для проверке идее в тестере.
И ссылку дал на
«Прошу написать мультивалютный советник для МТ5.
За основу можно взять уже написанный Вами советник Corel.mq5
strategy.opentraders.ru/28779.html».
И если не трудно добавте в советник усреднение.
avatar

ssg

  • 5 августа 2020, 04:47
0
Пробуйте сделать функцию

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void comment()
  {
   int k=0;
   string s="";
  
      for(int i=OrdersHistoryTotal()-1; i>0; i--)
        {
         if(k<count)
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
              {
               if(OrderSymbol()==_Symbol)
                 {
                  s+="\n Open Time: "+(string)OrderOpenTime()+" Close Time: "+(string)OrderCloseTime()
                  +" Lot: "+(string)OrderLots()+" Profit: "+(string)OrderProfit()
                  +" All Profit: "+(string)(OrderProfit()+OrderSwap()+OrderCommission());
                  k++;
                 }
              }
           }       
      Comment(s);
     }
  }
//+------------------------------------------------------------------+
):

и добавте в старт эту функцию
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   comment();
  }
avatar

ssg

  • 4 августа 2020, 14:23
0
К сожалению (счастью) я не телепат.Дайте весь код вашего советника.
avatar

ssg

  • 4 августа 2020, 13:35
0
В одном окне одновременная работа советников или (и) скриптов не возможна.
Можно доработать ваш советник, что бы он выводил эту информацию на экран.
avatar

ssg

  • 4 августа 2020, 08:23
0
Скрипт обычно исполняется 1 раз.Правда некоторые можно зациклить, т.е. выполнение его функций происходит постоянно «по кругу», а если в скрипте много вычислений вот тогда он сильно загружает процессор.
А почему именно скрипт?
avatar

ssg

  • 4 августа 2020, 04:30
0
Попробуйте этот вариант (это советник
/*
Мой вариант: добавил  OnTimer()

http://zakaz.opentraders.ru/55090.html#comment153103
Прошу написать скрипт, который будет отображаться на графике в левом верхнем углу 
(по возможности в виде прозрачной таблицы), историю последних пяти закрытых сделок инструмента на 
график которого он установлен.

История содержит:
1.дата и время открытия
2.дата и время закрытия
3.объём
4.профит или убыток в пунктах
5.профит или убыток в валюте счёта (если есть возможность с учётом свопа и комиссий)

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

готово: www.opentraders.ru/downloads/2718/

---Оч полезный скрипт, но сильно грузит терминал, виснет жёстко… Можно ли это как-то исправить?
*/
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict

input int count=5;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   //--- создадим таймер с периодом в 1 секунду
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   //--- уничтожим таймер при завершении работы
   EventKillTimer();
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   OnTimer();
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnTimer()
  {
   int k=0;
   string s="";
  
      for(int i=OrdersHistoryTotal()-1; i>0; i--)
        {
         if(k<count)
           {
            if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
              {
               if(OrderSymbol()==_Symbol)
                 {
                  s+="\n Open Time: "+(string)OrderOpenTime()+" Close Time: "+(string)OrderCloseTime()
                  +" Lot: "+(string)OrderLots()+" Profit: "+(string)OrderProfit()
                  +" All Profit: "+(string)(OrderProfit()+OrderSwap()+OrderCommission());
                  k++;
                 }
              }
           }       
      Comment(s);
     }
  }
//+------------------------------------------------------------------+
):
avatar

ssg

  • 17 июля 2020, 12:33
+1
«все также. может как у смилиона добавить к b и s цифры. типа s1++? И так в каждом ордере?»
Нет, это делать не обязательно.Это просто переменные — позиции бай и селл.
Главное что-бы у каждой группы был свой магик как функциях void Trailing.
avatar

ssg

  • 12 июля 2020, 04:20
0
У Вас в советнике 4 функции void Trailing(int type)
в каждой есть строка:
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

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

Расчет профита взят из советников смилиона. Там есть строка:
int m = OrderMagicNumber();
         if (OrderSymbol()==Symbol() && ( Magic==m || Magic1==m ||Magic2==m ||Magic3==m ))

т.е. считаете профит по всем позициям и всем 4 магикам.
По аналогии с void Trailing(int type) создайте (скопируйте ) 4 функции void Profit(int m)
и считайте профит по каждому магику отдельно, например:
int m = OrderMagicNumber();
            if (OrderSymbol()==Symbol() && Magic==m  )
            { 
avatar

ssg

  • 11 июля 2020, 18:39
0
Если отойти от «коробки» можно посмотреть здесь:
http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=42

http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=41

https://cmillion.ru/sovetnik-cm_line_revers/

avatar

ssg

  • 9 июля 2020, 11:06
+1
axe44 Я стесняюсь спросить :«Выкидыш социализма», а сами то чьих будете?
avatar

ssg

  • 1 июля 2020, 18:11