+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

AM2

  • 19 мая 2015, 11:29
0
Если вам нужно как было то вот прежняя версия: www.opentraders.ru/downloads/727/

Если сигнал не менять местами то нельзя будет поставить стоп на машке
avatar

AM2

  • 19 мая 2015, 00:05
0
П.1. Сделал закрытие в валюте депозита.
П.2. Ставим цену в настройках ниже которой советник не работает.

www.opentraders.ru/downloads/734/



avatar

AM2

  • 18 мая 2015, 23:49
0
Напишите ТЗ целиком. Править чужой не всегда удается. Оху сейчас не работает.
avatar

AM2

  • 18 мая 2015, 16:09
0
Я пробовал переделать советник. Проще написать новый. Нужно ТЗ целиком.
avatar

AM2

  • 18 мая 2015, 16:05
+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

AM2

  • 18 мая 2015, 11:54
0
Сделал: www.opentraders.ru/downloads/732/
Только вот это не совсем понятно:
Параметр количестов циклов работы.
Если параметр 1, то выставляем отложки один раз и все. Если много раз, то все время.


avatar

AM2

  • 18 мая 2015, 10:00
0
Да здесь функция БУ включается и сама функция
avatar

AM2

  • 17 мая 2015, 22:05
0
Завтра посмотрю почему
avatar

AM2

  • 17 мая 2015, 22:04
0
Сделал. Теперь подключает картинки: www.opentraders.ru/downloads/728/

avatar

AM2

  • 17 мая 2015, 15:29
+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

AM2

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

AM2

  • 16 мая 2015, 20:54
0
Только код в окошке под скрином.
avatar

AM2

  • 16 мая 2015, 20:50