0
обращайтесь, если что
avatar

Oxy

  • 13 февраля 2015, 15:26
0
Я не смогу это вылечить.
avatar

Oxy

  • 13 февраля 2015, 15:25
0
Добрый день! Стала я ваше задание изучать плотнее и у меня сложилось впечатление, что у вас нет готовой стратегии (с какой легкостью вы модифицировали предыдущую) и вы ищите универсальный тестер, с помощью которого вы хотите быстро протестировать различные идеи. Это впечатление у меня сложилось на основе фразы, встречающейся практически во всех пунктах: «Возможность отключения этого параметра.»

Далее, когда я стала программировать:
2. Если появилась новая точка пересечения МЕ5 и МЕ20 закрыть ордер. Возможность отключения этого параметра

У меня сложилось впечатление, что вы никогда не торговали на демо по МА. Хотя вы утверждаете обратное.
Потому что на истории МА выглядят идеально. Но у вас могут возникнуть вопросы, почему советник вот здесь

закрыл позицию. Потому что при торговле там было пересечение МА, которое перерисовалось.

Т.е. у вас есть куча идей, и вы нашли способ их проверить — с помощью советника. Хочу напомнить вам, что протестировать МА, их поведение, можно на демо, есть еще способ — ускоренно протестировать на истории, например, с помощью SimpleForexTester или других программ (погуглите или спросите в чате).
Когда же у вас появятся идеи именно для советника. Тогда обращайтесь.
Не обессудьте.
avatar

Oxy

  • 13 февраля 2015, 06:34
0
Я посмотрела скрипт. Написан он очень грамотно. Никак улучшить его не смогу. Изменять тоже не берусь. Индикатор с такими функциями не получится. У индикаторов другое предназначение.
Проверяла его на часовом графике eur/usd. У меня он отображает все бары. Только последний пятничный бар переносит в начало недели.
avatar

Oxy

  • 13 февраля 2015, 05:46
0
Замените функцию FindLastLot на эту:
double FindLastLot()
  {
   int i, k=OrdersTotal ();
   for (i=k-1; i>=0; i--) {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
         return (OrderLots());
       }
     }
   }
    return(Lots);
  } 


И потом напишите, как повел себя советник.
avatar

Oxy

  • 13 февраля 2015, 05:27
+2
Заменила: opentraders.ru/downloads/591/
Если значения:
Step_StopOrder      = 100;       // Шаг  stop  ордеров
StepPrice           = 200;       // Шаг подтягивания ордеров к цене

Это значит, что если цена ушла от ближайшего ордера на 200 пунктов, то все ордера передвинутся так, что к цене они встанут на расстоянии 100 пунктов.
avatar

Oxy

  • 13 февраля 2015, 02:57
0
Оно?
//+------------------------------------------------------------------+
//|                                                   Beton_Exp1.mq4 |
//|                                                              Oxy |
//|                                   http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link      "http://oxy.opentraders.ru/bio/"
#property version   "1.00"
#property strict
//------- Внешние параметры советника -----------------------------------------+
extern double Lot                 = 0.1;       // Лот
extern double ClosePosition       = 200;       // Через сколько пунктов закрываем позицию и открываем новую, 0 - не будет закрытия
extern double Drawdown            = 100;       // Просадка в пунктах, 0 - без просадки
extern int    SellOrBuy           = 1;         // SELL=1, BUY=0
extern int    Profit              = 10;        // Процент прибыли
extern int    WhichLotsRise       = 0;         // Увеличивает ордера: 0 - в просадке, 1 - по тейкпрофиту
              
extern int    Slippage   = 30;         // Проскальзывание цены
extern int    MagicNumber= 567582;     // Идентификатор ордера
//------- Глобальные переменные советника -------------------------------------+
string Symb;
double pricePoint = -1;
double newLot=Lot;
double plusLot=Lot;
double balance;
bool   stopBuySell = false;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if (!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать"); return(INIT_FAILED);}  
   Symb = Symbol();
   balance = AccountEquity();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    if(stopBuySell) return;
    
    // есть ордера
    if(OrdersTotal ()>0) {
      int i, k=OrdersTotal ();
      for (i=k-1; i>=0; i--) {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
            if(OrderType()==SellOrBuy) {
              managerOrder ();
            }
          }
        }
      }
    }
    // откат и начало
    if(SellOrBuy==0 && Ask<=pricePoint-Drawdown*Point && Drawdown>0) { 
      if(pricePoint==-1) newLot=Lot; 
      else {
        if(WhichLotsRise==0) newLot=Lot+newLot; 
        if(WhichLotsRise==1) newLot=Lot;
      }
      BuyPos(newLot); 
    }
    if(SellOrBuy==1 && Bid>=pricePoint+Drawdown*Point && Drawdown>0) { 
      
      if(pricePoint==-1) newLot=Lot; 
      else {
        if(WhichLotsRise==0) newLot=Lot+newLot; 
        if(WhichLotsRise==1) newLot=Lot;
      }
      SellPos(newLot);
    } 
    // ордеров, выставленных, нет
    if(OrdersTotal ()==0) {
      if(SellOrBuy==0) { 
        if(WhichLotsRise==0) newLot=Lot;
        if(WhichLotsRise==1) { newLot=Lot+plusLot; plusLot=newLot;}
        balance = AccountEquity(); BuyPos(newLot); 
      }
      if(SellOrBuy==1) { 
        if(WhichLotsRise==0) newLot=Lot; 
        if(WhichLotsRise==1) { newLot=Lot+plusLot; plusLot=newLot;} 
        balance = AccountEquity(); SellPos(newLot); 
      }
    } 
    if(AccountEquity()>=balance*Profit/100+balance) { deleteAllPos (); plusLot=Lot; newLot=Lot; }
  }
//+------------------------------------------------------------------+
void deleteAllPos () {
  int i, ot;

  for (i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {      
      if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
        ot=OrderType();
        if (ot>1 && ot<6) {
          if (!OrderDelete(OrderTicket())) Print("Не удалось удалить ордер!");
        } 
        if(ot==0){
          if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage))  Print("Не удалось закрыть ордер!");
          else stopBuySell=false;
        }
        if(ot==1) {
          if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage))  Print("Не удалось закрыть ордер!");
          else stopBuySell=false;
        }
      }
    }
  }
}
//+------------------------------------------------------------------+
void managerOrder () {
      
      double price = OrderOpenPrice ();
      if(price>-1) {
        if(SellOrBuy==0 && OrderType()==0) {
          if(Bid>=price+ClosePosition*Point && ClosePosition>0) { // закрываем и открываем новый
            int ticket = OrderTicket();
            if(OrderClose(ticket, OrderLots(), Bid, Slippage)) {
              if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) pricePoint = OrderClosePrice();
              stopBuySell=false;
            }    
            else Print("Не удалось закрыть ордер BUY!");        
          }
        }
        if(SellOrBuy==1 && OrderType()==1) {
          if(Ask<=price-ClosePosition*Point && ClosePosition>0) { // закрываем и открываем новый
            int ticket = OrderTicket();
            if(OrderClose(ticket, OrderLots(), Bid, Slippage)) {
              if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) pricePoint = OrderClosePrice();
              stopBuySell=false;
            }
            else Print("Не удалось закрыть ордер SELL!");
          }   
        }
      }
}
//+------------------------------------------------------------------+
bool BuyPos(double _lot) {
  double sl=0, tp=0;
  int ticket = OrderSend(Symb, OP_BUY, _lot, NormalizeDouble(Ask,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber); 
  if (ticket == -1) { stopBuySell=true; Print("Ошибка совершении сделки!"); return(false);}
  if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePoint = OrderOpenPrice();
  return (true);
}
bool SellPos(double _lot) {
  double sl=0, tp=0;
  int ticket = OrderSend(Symb, OP_SELL, _lot, NormalizeDouble(Bid,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber); 
  if (ticket == -1) { stopBuySell=true; Print("Ошибка совершении сделки!"); return(false);}
  if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePoint = OrderOpenPrice();
  return (true);
}
//+------------------------------------------------------------------+
avatar

Oxy

  • 13 февраля 2015, 01:33
0
Хорошо, поправлю (через один-два дня)
avatar

Oxy

  • 12 февраля 2015, 19:52
0
Если что-то не работает или работает не так как вы хотите, вы пишите, прикрепляйте скрины, будем разбираться.
avatar

Oxy

  • 12 февраля 2015, 15:43
+1
Так надо или не надо подтягивать ордера за ценой? Потестите, определитесь и если надо, пишите, сделаю. Только опишите подробнее, а то я чуть недопонимаю, что надо сделать.
avatar

Oxy

  • 12 февраля 2015, 15:41
0
Вам для МТ4?
Не поняла фразы:
При открытии 2 оставшиеся отложки закрыть

Вы имели ввиду, если один из ордеров сработает, то противоположные закрыть?
И второе:
при прикреплении к графику искала ордера, если ордеров нет

А если есть?
avatar

Oxy

  • 12 февраля 2015, 15:37
0
Смотрите у нас куча ордеров (к примеру) sell, в том числе в просадке. И вдруг один закрылся в плюсе по ClosePosition. Следующий, который открывается sell — уже будет увеличенным лотом. Хорошо, а если мы опять уйдем в просадку по sell? Лот для них тоже увеличивать? Т.е. после одного сработанного ClosePosition для sell для всех последующих любых sell мы увеличиваем лот? Пока не закроемся по эквити?
avatar

Oxy

  • 11 февраля 2015, 20:53
0
Ну как не все?
Вот же все закрывает:


Закрыт весь бай и потом открывает новый.



Принимаются прин-скрины графиков и скрины вкладки в тестере — результаты.
avatar

Oxy

  • 11 февраля 2015, 20:30
0
Вы писали:
Да, сейчас делаем только что бы в случае закрытия сделки по трейлингу, остальные сделки тоже закрывались по данному направлению.

По данному направлению сделки все и закрываются. Противоположные не трогаются.
avatar

Oxy

  • 11 февраля 2015, 16:28
0
вместо:
if(AccountEquity()>=balance*Profit/100+balance) deleteAllPos ();

сделайте:
if(AccountEquity()>=balance*Profit/100+balance) { deleteAllPos (); newLot=Lot; }
avatar

Oxy

  • 11 февраля 2015, 16:22
+1
проверяйте:
//+------------------------------------------------------------------+
//|                                                   Beton_Exp1.mq4 |
//|                                                              Oxy |
//|                                   http://oxy.opentraders.ru/bio/ |
//+------------------------------------------------------------------+
#property copyright "Oxy"
#property link      "http://oxy.opentraders.ru/bio/"
#property version   "1.00"
#property strict
//------- Внешние параметры советника -----------------------------------------+
extern double Lot                 = 0.1;       // Лот
extern double ClosePosition       = 200;       // Через сколько пунктов закрываем позицию и открываем новую, 0 - не будет закрытия
extern double Drawdown            = 100;       // Просадка в пунктах, 0 - без просадки
extern int    SellOrBuy           = 1;         // SELL=1, BUY=0
extern int    Profit              = 10;        // Процент прибыли
extern int    WhichLotsRise       = 0;         // Увеличивает ордера: 0 - в просадке, 1 - по тейкпрофиту
              
extern int    Slippage   = 30;         // Проскальзывание цены
extern int    MagicNumber= 567582;     // Идентификатор ордера
//------- Глобальные переменные советника -------------------------------------+
string Symb;
double pricePoint = -1;
double newLot=Lot;
double balance;
bool   stopBuySell = false;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if (!IsTradeAllowed()) { Print("Необходимо разрешить советнику торговать"); return(INIT_FAILED);}  
   Symb = Symbol();
   balance = AccountEquity();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    if(stopBuySell) return;
    
    // есть ордера
    if(OrdersTotal ()>0) {
      int i, k=OrdersTotal ();
      for (i=k-1; i>=0; i--) {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
            if(OrderType()==SellOrBuy) {
              managerOrder ();
            }
          }
        }
      }
    }
    // откат и начало !!!
    if(SellOrBuy==0 && Ask<=pricePoint-Drawdown*Point && Drawdown>0) { 
      if(pricePoint==-1) newLot=Lot; 
      else {
        if(WhichLotsRise==0) newLot=Lot+newLot; 
        if(WhichLotsRise==1) newLot=Lot;
      }
      BuyPos(newLot); 
    }
    if(SellOrBuy==1 && Bid>=pricePoint+Drawdown*Point && Drawdown>0) { 
      
      if(pricePoint==-1) newLot=Lot; 
      else {
        if(WhichLotsRise==0) newLot=Lot+newLot; 
        if(WhichLotsRise==1) newLot=Lot;
      }
      SellPos(newLot);
    } 
    // ордеров, выставленных, нет !!!
    if(OrdersTotal ()==0) {
      if(SellOrBuy==0) { 
        if(WhichLotsRise==0) newLot=Lot;
        if(WhichLotsRise==1) newLot=Lot+newLot;
        balance = AccountEquity(); BuyPos(newLot); 
      }
      if(SellOrBuy==1) { 
        if(WhichLotsRise==0) newLot=Lot; 
        if(WhichLotsRise==1) newLot=Lot+newLot; 
        balance = AccountEquity(); SellPos(newLot); 
      }
    } 
    if(AccountEquity()>=balance*Profit/100+balance)  deleteAllPos ();
  }
//+------------------------------------------------------------------+
void deleteAllPos () {
  int i, ot;

  for (i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {      
      if (OrderSymbol()==Symb && OrderMagicNumber()==MagicNumber) {
        ot=OrderType();
        if (ot>1 && ot<6) {
          if (!OrderDelete(OrderTicket())) Print("Не удалось удалить ордер!");
        } 
        if(ot==0){
          if (!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage))  Print("Не удалось закрыть ордер!");
          else stopBuySell=false;
        }
        if(ot==1) {
          if (!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage))  Print("Не удалось закрыть ордер!");
          else stopBuySell=false;
        }
      }
    }
  }
}
//+------------------------------------------------------------------+
void managerOrder () {
      
      double price = OrderOpenPrice ();
      if(price>-1) {
        if(SellOrBuy==0 && OrderType()==0) {
          if(Bid>=price+ClosePosition*Point && ClosePosition>0) { // закрываем и открываем новый
            int ticket = OrderTicket();
            if(OrderClose(ticket, OrderLots(), Bid, Slippage)) {
              if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) pricePoint = OrderClosePrice();
              stopBuySell=false;
            }    
            else Print("Не удалось закрыть ордер BUY!");        
          }
        }
        if(SellOrBuy==1 && OrderType()==1) {
          if(Ask<=price-ClosePosition*Point && ClosePosition>0) { // закрываем и открываем новый
            int ticket = OrderTicket();
            if(OrderClose(ticket, OrderLots(), Bid, Slippage)) {
              if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) pricePoint = OrderClosePrice();
              stopBuySell=false;
            }
            else Print("Не удалось закрыть ордер SELL!");
          }   
        }
      }
}
//+------------------------------------------------------------------+
bool BuyPos(double _lot) {
  double sl=0, tp=0;
  int ticket = OrderSend(Symb, OP_BUY, _lot, NormalizeDouble(Ask,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber); 
  if (ticket == -1) { stopBuySell=true; Print("Ошибка совершении сделки!"); return(false);}
  if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePoint = OrderOpenPrice();
  return (true);
}
bool SellPos(double _lot) {
  double sl=0, tp=0;
  int ticket = OrderSend(Symb, OP_SELL, _lot, NormalizeDouble(Bid,Digits), Slippage, NormalizeDouble(sl,Digits), NormalizeDouble(tp,Digits), NULL, MagicNumber); 
  if (ticket == -1) { stopBuySell=true; Print("Ошибка совершении сделки!"); return(false);}
  if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) pricePoint = OrderOpenPrice();
  return (true);
}
//+------------------------------------------------------------------+
avatar

Oxy

  • 11 февраля 2015, 13:10
0
да, полностью замените код советника на этот в MetaEditor и нажмите кнопку «компилировать»
avatar

Oxy

  • 11 февраля 2015, 11:53