Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Просьба добавить одну простую функццию в советник Exp_CloseLosePositions

Здравствуйте. Просьба добавить одну функцию в советник (сам советник не открывает, а закрывает уже открытые сделки в ручную или другим советником), который делала Oxy.
Вот ссылка на сам советник: opentraders.ru/downloads/699/
Необходимо добавить параметр -«количество профитных сделок», которыми будут перекрываться самый первый (или первые) минусовый ордер.
Логика такая, там уже стоит функция -«количество самых первых» (открытых по времени) минусовых ордеров, которые будут перекрываться всеми плюсовыми. Надо просто добавить функцию, чтобы перекрывались не всеми плюсовыми, а определенным количеством, перекрытие будет брать в расчет только самые профитные положительные сделки, а не любые.
Советник сейчас работает так: он берет самый старый открытый по времени ордер, который находиться в минусе, и когда профит всех
положительных сделок превышает этот самый первый открытый ордер, то они закрываются в общем Х профите. То есть в советнике уже все есть и все вроде бы работает, надо только сделать функцию- количество самых профитных, которыми будет перекрываться.

И еще скажите, пожалуйста, на сколько сложно добавить индикацию на графике, чтобы после срабатывания перекрытия на графике оставлялся значек в каком месте он сработал (видел на графике ставяться кружечки со стрелками или полосками). И если это не сложно, можно это тоже добавить? А то я с этим советником вторую неделю работаю и не могу понять правильно он работает или нет, появляются сомнения в некоторых моментах, особенно в мультивалютном режиме, но может это я не уследил что-то, сложно без индикации вообщем.

Заранее спасибо.
  • 0
  • Просмотров: 6098
  • 15 мая 2015, 12:54
  • anathem
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
доработка №2 к советнику МА
15 мая 2015
15 мая 2015

Брокер для ваших роботов, 15 лет на рынке

Комментарии (18)

+
+1
Завтра буду смотреть ваш заказ
avatar

  35  AM2 Сообщений: 16249 - Андрей

  • 16 мая 2015, 18:02
+
0
Спасибо за ответ *victory* 
avatar

  7  anathem Автор Сообщений: 142

  • 16 мая 2015, 18:14
+
0
Мне будет намного проще взять определенное количество последних открытых плюсовых ордеров, чем осуществлять перебор.
avatar

  35  AM2 Сообщений: 16249 - Андрей

  • 16 мая 2015, 20:54
+
0
Хм. Даже не знаю, можно попробовать и так. Допустим у нас очень много сделок открыто (к примеру 10), из 3-х последних одна в плюсе и 2 в минусе, наши последние 3 сделки идут в порядке открытия так: 8-й ордер открыт в 13:00, 9-й в 13:10, 10-й в 13:20. 8-й ордер в профите, а последние 2 в минусе. Если у нас в параметрах стоит перекрывать самую первую зависшую сделку первой последней положительной, то он просто возьмет наш 1-й зависший и перекроет его 8-м(конечно если ее профит превышает на Х баланса)? Если в параметрах укажем количество 3 положительные сделки, то советник просто найдет последние 3 положительные и перекроет первую? Если так, то можно попробовать.

Но хотелось бы, чтобы брались самые большие по профиту в валюте депо, ибо сделки не достигшие профита, могут в дальнейшем прибавить в нем.
Хотя меня устроит любой вариант <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; '>&nbsp; 
Редактирован: 16 мая 2015, 23:40
avatar

  7  anathem Автор Сообщений: 142

  • 16 мая 2015, 23:39
+
0
Просчитал что и как, если я правильно выше все описал, как оно будет работать, то такой вариант вполне подходит.
avatar

  7  anathem Автор Сообщений: 142

  • 17 мая 2015, 10:35
+
+1
Я набросал код но нужно еще отлаживать будет:


//+------------------------------------------------------------------+
//|                                      Exp_CloseLose_Positions.mq4 |
//|                                                              Oxy |
//|                                   http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link      "http://oxy.opentraders.ru/bio/"
#property version   "1.00"
#property strict
enum name_orders {
   BUY,
   SELL,
   ANY,
};
//------- Внешние параметры -----------------------------------------+
extern bool        CurrSymb     = true;   // Только текущая пара или все
extern name_orders NamePosLost  = ANY;    // Закрываемые минусовые ордера
extern name_orders NamePosClose = ANY;    // Те ордера, которыми закрывать
extern int         NumLostOrdrs = 3;      // Количество закрываемых минусовых ордеров
extern int         NumProfOrdrs = 3;      // Количество последних закрываемых плюсовых ордеров
extern double      Profit       = 0;      // Прибыль
extern int         Slippage     = 30;     // Проскальзывание цены при закрытии
//------- Глобальные переменные -------------------------------------+
string   Symb;
int      arrTMinus[];
int      arrTPlus[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if (!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать!"); return(INIT_FAILED);}
   if (CurrSymb) Symb = Symbol(); else Symb = NULL;
   if (NumLostOrdrs<=0)   { Print("Неправильно выставлено количество!");        return(INIT_FAILED);} 
   if (Profit<0)          { Print("Прибыль не может быть отрицательной!");      return(INIT_FAILED);} 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    double _minus = 0;
    if(NamePosLost==BUY) _minus = HaveOpenPos_Minus(0);//минусы по бай селл и обеим
    if(NamePosLost==SELL)_minus = HaveOpenPos_Minus(1);
    if(NamePosLost==ANY) _minus = HaveOpenPos_Minus();
    if(_minus>=0) return;
    double _plus = 0;
    if(NamePosClose==BUY) _plus = HaveLastOpenPos_Plus(0);//плюсы по бай селл и обеим
    if(NamePosClose==SELL)_plus = HaveLastOpenPos_Plus(1);
    if(NamePosClose==ANY) _plus = HaveLastOpenPos_Plus();
    if(_plus<=0) return;
    if(_minus+_plus>=Profit) closePositions (_minus);//закрываеи одну убыточную позу серией плюсовых ордеров
    
  }
//+------------------------------------------------------------------+
void closePositions (double minus) {
  int sizeMins =  ArraySize(arrTMinus);
  for(int i=0; i<sizeMins; i++) {
    if(OrderSelect(arrTMinus[i], SELECT_BY_TICKET, MODE_TRADES)) {
      if(OrderType()==0) {
        RefreshRates();
        if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage))  Print("Не удалось закрыть ордер ", OrderTicket(), "!");
      }
      if(OrderType()==1) {
        RefreshRates();
        if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage))  Print("Не удалось закрыть ордер ", OrderTicket(), "!");
      }
    }
  }

  int sizePlus =  ArraySize(arrTPlus);//размер массива(10) нужно 3 последних
  double totPlus = 0, _profit;
  for(int j=sizePlus-NumProfOrdrs; j<sizePlus; j++) {
    if(OrderSelect(arrTPlus[j], SELECT_BY_TICKET, MODE_TRADES)) {
      if(OrderType()==0) {
        RefreshRates();
        _profit = OrderProfit() + OrderCommission() + OrderSwap();
        if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage))  Print("Не удалось закрыть ордер ", OrderTicket(), "!");
        else totPlus +=  _profit;
      }
      if(OrderType()==1) {
        RefreshRates();
        _profit = OrderProfit() + OrderCommission() + OrderSwap();
        if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage))  Print("Не удалось закрыть ордер ", OrderTicket(), "!");
        else totPlus +=  _profit;
      }
      if (minus+totPlus>=Profit) break;
    }
  }
}
//+------------------------------------------------------------------+
double HaveLastOpenPos_Plus(int ot=-1) {
  if(ot<0 || ot>1) ot=-1;
  
  int sizePlus =  ArraySize(arrTPlus);//считали размер массива(10) нужно 3 последних
  double totPlus = 0, _profit;
  for(int j=sizePlus-NumProfOrdrs; j<sizePlus; j++) {
    if(OrderSelect(arrTPlus[j], SELECT_BY_TICKET, MODE_TRADES)) {
      if(OrderType()==0) {
        RefreshRates();
        _profit = OrderProfit() + OrderCommission() + OrderSwap();
         totPlus +=  _profit;
      }
      if(OrderType()==1) {
        RefreshRates();
        _profit = OrderProfit() + OrderCommission() + OrderSwap();
         totPlus +=  _profit;
      }
    }
  }
  return (totPlus);
}
//+------------------------------------------------------------------+
double HaveOpenPos_Plus(int ot=-1) {
  ArrayResize(arrTPlus, 0);
  int i, k = OrdersTotal ();
  if(ot<0 || ot>1) ot=-1;
  double totPlus = 0, _profit;
  for (i=0; i<k; i++) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (Symb==NULL || OrderSymbol()==Symb) {
        _profit = 0;
        if(ot==-1) {
          if (OrderType()==0 || OrderType()==1) {
            _profit = OrderProfit() + OrderCommission() + OrderSwap();            
          }
        } else {
          if(ot==OrderType()) {
            _profit = OrderProfit() + OrderCommission() + OrderSwap();
          }
        }
        if(_profit>0) {
          totPlus +=_profit;
          int size =  ArraySize(arrTPlus);
          ArrayResize(arrTPlus, size+1);
          arrTPlus[size] = OrderTicket();
        }
      }
    }
  }
  return (totPlus);
}
//+------------------------------------------------------------------+
double HaveOpenPos_Minus(int ot=-1) {
  ArrayResize(arrTMinus, 0);
  int i, k = OrdersTotal (), num=0;
  if(ot<0 || ot>1) ot=-1;
  double totMinus = 0, _profit;
  for (i=0; i<k; i++) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (Symb==NULL || OrderSymbol()==Symb) {
        _profit = 0;
        if(ot==-1) {
          if (OrderType()==0 || OrderType()==1) {
            _profit = OrderProfit() + OrderCommission() + OrderSwap();            
          }
        } else {
          if(ot==OrderType()) {
            _profit = OrderProfit() + OrderCommission() + OrderSwap();
          }
        }
        if(_profit<0) {
          totMinus +=_profit;
          int size =  ArraySize(arrTMinus);
          ArrayResize(arrTMinus, size+1);
          arrTMinus[size] = OrderTicket();
          num++;
        }
        if(num>=NumLostOrdrs) break;
      }
    }
  }
  return (totMinus);
}
//+------------------------------------------------------------------+
avatar

  35  AM2 Сообщений: 16249 - Андрей

  • 17 мая 2015, 12:34
+
0
Спасибо. Буду ждать. Надеюсь все получится.
avatar

  7  anathem Автор Сообщений: 142

  • 17 мая 2015, 23:03
+
+1
Невоспиимчив я оказался к чужому коду. Пишу все по своему, используя предыдущие наработки. Сейчас серия минусов перекрывается серией плюсов и ставим маркер. Далее буду стараться делать ближе к ТЗ от простого к сложному:



//+------------------------------------------------------------------+
//|                                      Exp_CloseLose_Positions.mq4 |
//|                                                              Oxy |
//|                                   http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link      "http://oxy.opentraders.ru/bio/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum name_orders
  {
   BUY,
   SELL,
   ANY,
  };
//------- Внешние параметры -----------------------------------------+
extern bool        CurrSymb     = true;   // Только текущая пара или все
extern name_orders NamePosLost  = ANY;    // Закрываемые минусовые ордера
extern name_orders NamePosClose = ANY;    // Те ордера, которыми закрывать
extern int         NumLostOrdrs = 3;      // Количество закрываемых минусовых ордеров
extern int         NumProfOrdrs = 3;      // Количество последних закрываемых плюсовых ордеров
extern double      Profit       = 0;      // Прибыль
extern int         Slippage     = 30;     // Проскальзывание цены при закрытии
//------- Глобальные переменные -------------------------------------+
string   Symb;
int      arrTMinus[];
int      arrTPlus[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать!"); return(INIT_FAILED);}
   if(CurrSymb) Symb=Symbol(); else Symb=NULL;
   if(NumLostOrdrs<=0)   { Print("Неправильно выставлено количество!");        return(INIT_FAILED);}
   if(Profit<0)          { Print("Прибыль не может быть отрицательной!");      return(INIT_FAILED);}
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { Comment("");}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   Comment("\n Минус ",PosMinus(),
           "\n Плюс ",PosPlus());

/*   double _minus = 0;
   if(NamePosLost==BUY) _minus=HaveOpenPos_Minus(0);//минусы по бай селл и обеим
   if(NamePosLost==SELL)_minus = HaveOpenPos_Minus(1);
   if(NamePosLost==ANY) _minus = HaveOpenPos_Minus();
   //if(_minus>=0) return;
   double _plus=0;
   if(NamePosClose==BUY) _plus=HaveLastOpenPos_Plus(0);//плюсы по бай селл и обеим
   if(NamePosClose==SELL)_plus = HaveLastOpenPos_Plus(1);
   if(NamePosClose==ANY) _plus = HaveLastOpenPos_Plus();
   //if(_plus<=0) return;
*/
   if(PosMinus()+PosPlus()>=Profit)
     {
      CloseAll();            //закрываеи убыточные позы серией плюсовых ордеров
      PutPointer();          //--- создаем указатель
     }


  }
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
double PosPlus()
  {
   double profit=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol())
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
           {
            if(OrderProfit()>0)
              {
               profit+=OrderProfit();
              }
           }
     }
   return(profit);
  }
//+------------------------------------------------------------------+
double PosMinus()
  {
   double profit=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol())
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
           {
            if(OrderProfit()<0)
              {
               profit+=OrderProfit();
              }
           }
     }
   return(profit);
  }
//+------------------------------------------------------------------+ 
void CloseAll()
  {
   bool cl,sel;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),Bid,30,Blue);
         if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),Ask,30,Red);
         Sleep(1000);
        }
     }
  }
//+------------------------------------------------------------------+
void PutPointer()
  {
//--- создаем указатель 
   ObjectCreate("Pointer",OBJ_ARROW,0,Time[0],High[1]+20*Point,0,0);
   ObjectSet("Pointer",OBJPROP_BACK,true);
   ObjectSet("Pointer",OBJPROP_COLOR,clrRed);
   ObjectSet("Pointer",OBJPROP_ARROWCODE,91);
   ObjectSet("Pointer",OBJPROP_WIDTH,2);
   ObjectSet("Pointer",OBJPROP_SELECTED,true);
  }
//+------------------------------------------------------------------+
avatar

  35  AM2 Сообщений: 16249 - Андрей

  • 18 мая 2015, 11:54
+
0
Да я тоже подумал, что наверно лучше сначало все сделать. Попробую сейчас хотя бы эту версию. Спасибо :) 
avatar

  7  anathem Автор Сообщений: 142

  • 18 мая 2015, 12:29
+
+1
Cделал еще один вариант посмотрите:



//+------------------------------------------------------------------+
//|                                      Exp_CloseLose_Positions.mq4 |
//|                                                              Oxy |
//|                                   http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link      "http://oxy.opentraders.ru/bio/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum name_orders 
  {
   BUY,
   SELL,
   ANY,
  };
//------- Внешние параметры -----------------------------------------+
extern bool        CurrSymb     = true;   // Только текущая пара или все
extern name_orders NamePosLost  = ANY;    // Закрываемые минусовые ордера
extern name_orders NamePosClose = ANY;    // Те ордера, которыми закрывать
extern int         NumLostOrdrs = 3;      // Количество закрываемых минусовых ордеров
extern int         NumProfOrdrs = 3;      // Количество закрываемых плюсовых ордеров
extern double      Profit       = 0;      // Прибыль
extern int         Slippage     = 30;     // Проскальзывание цены при закрытии
//------- Глобальные переменные -------------------------------------+
string   Symb;
int      arrTMinus[];
int      arrTPlus[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать!"); return(INIT_FAILED);}
   if(CurrSymb) Symb=Symbol(); else Symb=NULL;
   if(NumLostOrdrs<=0)   { Print("Неправильно выставлено количество!");        return(INIT_FAILED);}
   if(Profit<0)          { Print("Прибыль не может быть отрицательной!");      return(INIT_FAILED);}
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double _minus = 0;
   if(NamePosLost==BUY) _minus = HaveOpenPos_Minus(0);
   if(NamePosLost==SELL)_minus = HaveOpenPos_Minus(1);
   if(NamePosLost==ANY) _minus = HaveOpenPos_Minus();
   if(_minus>=0) return;
   double _plus=0;
   if(NamePosClose==BUY) _plus = HaveOpenPos_Plus(0);
   if(NamePosClose==SELL)_plus = HaveOpenPos_Plus(1);
   if(NamePosClose==ANY) _plus = HaveOpenPos_Plus();
   if(_plus<=0) return;
   if(_minus+_plus>=Profit)
     {
      closePositions(_minus);
      PutPointer();
     }
   Comment("\n Общий минус ",_minus,
           "\n Общий плюс ",_plus);
  }
//+------------------------------------------------------------------+
void closePositions(double minus) 
  {
   int sizeMins=ArraySize(arrTMinus);
   for(int i=0; i<sizeMins; i++) 
     {
      if(OrderSelect(arrTMinus[i],SELECT_BY_TICKET,MODE_TRADES)) 
        {
         if(OrderType()==0) 
           {
            RefreshRates();
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage)) Print("Не удалось закрыть ордер ",OrderTicket(),"!");
           }
         if(OrderType()==1) 
           {
            RefreshRates();
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage)) Print("Не удалось закрыть ордер ",OrderTicket(),"!");
           }
        }
     }
   int sizePlus=ArraySize(arrTPlus);
   double totPlus=0,_profit;
   for(int j=0; j<sizePlus; j++) 
     {
      if(OrderSelect(arrTPlus[j],SELECT_BY_TICKET,MODE_TRADES)) 
        {
         if(OrderType()==0) 
           {
            RefreshRates();
            _profit=OrderProfit()+OrderCommission()+OrderSwap();
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage)) Print("Не удалось закрыть ордер ",OrderTicket(),"!");
            else totPlus+=_profit;
           }
         if(OrderType()==1) 
           {
            RefreshRates();
            _profit=OrderProfit()+OrderCommission()+OrderSwap();
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage)) Print("Не удалось закрыть ордер ",OrderTicket(),"!");
            else totPlus+=_profit;
           }
         if(minus+totPlus>=Profit) break;
        }
     }
  }
//+------------------------------------------------------------------+
double HaveOpenPos_Plus(int ot=-1) 
  {
   ArrayResize(arrTPlus,0);
   int i,k=OrdersTotal(),num=0;
   if(ot<0 || ot>1) ot=-1;
   double totPlus=0,_profit;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(Symb==NULL || OrderSymbol()==Symb) 
           {
            _profit=0;
            if(ot==-1) 
              {
               if(OrderType()==0 || OrderType()==1) 
                 {
                  _profit=OrderProfit()+OrderCommission()+OrderSwap();
                 }
                 } else {
               if(ot==OrderType()) 
                 {
                  _profit=OrderProfit()+OrderCommission()+OrderSwap();
                 }
              }
            if(_profit>0) 
              {
               totPlus +=_profit;
               int size =  ArraySize(arrTPlus);
               ArrayResize(arrTPlus,size+1);
               arrTPlus[size]=OrderTicket();
               num++;
              }
             if(num>=NumProfOrdrs) break;
           }
        }
     }
   return (totPlus);
  }
//+------------------------------------------------------------------+
double HaveOpenPos_Minus(int ot=-1) 
  {
   ArrayResize(arrTMinus,0);
   int i,k=OrdersTotal(),num=0;
   if(ot<0 || ot>1) ot=-1;
   double totMinus=0,_profit;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(Symb==NULL || OrderSymbol()==Symb) 
           {
            _profit=0;
            if(ot==-1) 
              {
               if(OrderType()==0 || OrderType()==1) 
                 {
                  _profit=OrderProfit()+OrderCommission()+OrderSwap();
                 }
                 } else {
               if(ot==OrderType()) 
                 {
                  _profit=OrderProfit()+OrderCommission()+OrderSwap();
                 }
              }
            if(_profit<0) 
              {
               totMinus+=_profit;
               int size =  ArraySize(arrTMinus);
               ArrayResize(arrTMinus,size+1);
               arrTMinus[size]=OrderTicket();
               num++;
              }
            if(num>=NumLostOrdrs) break;
           }
        }
     }
   return (totMinus);
  }
//+------------------------------------------------------------------+
void PutPointer()
  {
//--- создаем указатель 
   ObjectCreate("Pointer"+TimeToString(Time[0]),OBJ_ARROW,0,Time[1],High[1]+20*Point,0,0);
   ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_BACK,true);
   ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_COLOR,clrRed);
   ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_ARROWCODE,91);
   ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_WIDTH,2);
   ObjectSet("Pointer"+TimeToString(Time[0]),OBJPROP_SELECTED,true);
  }
//+------------------------------------------------------------------+
avatar

  35  AM2 Сообщений: 16249 - Андрей

  • 19 мая 2015, 11:29
+
0
Спасибо! Прошлая не особо хотела работать, глючила. Буду сейчас эту проверять, отпишусь.
Редактирован: 19 мая 2015, 14:20
avatar

  7  anathem Автор Сообщений: 142

  • 19 мая 2015, 13:56
+
0
Скажите, а с работой с разными парами достаточно советник поставить на одно окно и в параметрах ввести fasle? На демо счете неправильно сработал почему-то, закрыл только 3 положительные (в настройках стоит 1 минусовый и 3 положительных) и все, минусовые открыты не трогал их. На счете сейчас самый первый минусовый ордер висит в -8центов, на счету сейчас куча сделок с +50 центов ордерами, но на разных парах, закрывать не хочет первый минусовый, положительными. В настройках указал закрывать при профите 15центов, а сделок положительных на счету более 150центов. Попробовал на каждую пару поставить советник, не закрывает все равно.
avatar

  7  anathem Автор Сообщений: 142

  • 19 мая 2015, 15:12
+
0
Не получается у меня эта штука.
avatar

  35  AM2 Сообщений: 16249 - Андрей

  • 19 мая 2015, 18:27
+
0
В любом случае спасибо :) 
Хорошо, что на одной паре вроде бы все правильно работает, уже проверил!
avatar

  7  anathem Автор Сообщений: 142

  • 19 мая 2015, 18:31
+
0
Скажите, а что если забить на мультивалютность и сделать тоже самое, но со стабильной работой только на одной паре?
avatar

  7  anathem Автор Сообщений: 142

  • 19 мая 2015, 20:18
+
0
Это так шпаргалка мне, если соберусь делать :) 

uses crt;
const nmax=100;
var z,a:array[1..nmax] of integer;
    m,i,k,n,j,p:integer;
begin
clrscr;
randomize;
repeat
write('Размер массива до ',nmax,' m=');
readln(m);
until m in [1..nmax];
writeln('Исходный массив:');
for i:=1 to m do
 begin
  z[i]:=random(50);
  write(z[i]:4);
 end;
writeln;
repeat
write('Сколько максимальных выбрать от 1 до ',m,' k=');
readln(k);
until k in [1..m];
n:=1;
a[n]:=z[1];{берем первый элемент в дополнительный массив}
for i:=2 to m do{смотрим остальные}
 begin
  n:=n+1;{увеличим размер доп. массива}
  if z[i]<=a[n-1] then a[n]:=z[i]{если не больше последнего, добавим в конец}
  else{иначе}
   begin
    j:=1;
    while a[j]>=z[i] do{найдем место для вставки}
    j:=j+1;
    for p:=n downto j+1 do
    a[p]:=a[p-1];{раздвинем доп. массив}
    a[j]:=z[i];{вставим}
   end;
 end;
{выведем первые к}
writeln('Первые ',k,' максимальных:');
for i:=1 to k do
write(a[i]:4);
readln
end.
avatar

  35  AM2 Сообщений: 16249 - Андрей

  • 16 мая 2015, 20:25
+
0
Есть рабочий вариант советника для торговли на реале на одной паре? Профит в сове в долларах ставиться или в центах, т.е. какое значение поставить в extern double Profit, чтобы закрывалось с прибылью 1 доллар на центовом счете? Или зависит от типа счета центовый или долларовый?
avatar

  1  StrelokFX Сообщений: 8

  • 11 июня 2016, 10:03
+
0
Кто может сделать extern double Profit в процентах от депозита на счете, т.е. если депозит = 10000 cent usd и указав в данном параметре 1%, то закрывается перекрытие ордеров с профитом 1% от депозита, что составляет = 10 cent usd и так далее…
avatar

  1  StrelokFX Сообщений: 8

  • 11 июня 2016, 11:32

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