Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужно пополнить счет? Пополняй удобным тебе способом!
boraliht
55
boraliht 2012.02.09 08:33 

как в советник добавить функцию мартингейла? помогите прописать....советник ставит отложенные ордера по хай и лов с тайк профитом и стопом, нужно чтобы после убыточного ордера он увеличивал объем по мартингейлу(Х2),после выигрыша начинал с минимального лота.

Файлы:
Vladislav Andruschenko
83080
Vladislav Andruschenko 2012.02.09 17:59  

Если последняя сделка убыточная - умножаем лот последней сделки на 2, если нет - ставим первоначальный.

закрылась ли последняя сделка по стопу:

bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl || OrderProfit()<0) return(True);
  }
  return(False);
}

далее в проверке лотов ставим:

  if (isCloseLastPosByStop(Symbol(),-1,Magic))
Lot2=OrderLots()*Martin;
   if (!isCloseLastPosByStop(Symbol(),-1,Magic))Lot2=Первоначальный лот ;   if(Lot2 < MinLots) Lot2 = MinLots;   if(Lot2 > MaxLots) Lot2 = MaxLots;   return(NormalizeDouble(Lot2,2));
hoz
1936
hoz 2012.09.08 13:37  

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

То что идёт выборка всех ордеров на истории я вижу, но где про последний закрытый ордер не вижу.

khorosh
8058
khorosh 2012.09.08 15:13  
hoz:

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

То что идёт выборка всех ордеров на истории я вижу, но где про последний закрытый ордер не вижу.

В функции isCloseLastPosByStop() определяется закрылся ли последний по времени ордер по стопу.

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

if (isCloseLastPosByStop(Symbol(),-1,Magic))
Lot2=OrderLots()*Martin;
Только Vladon почему то использовал здесь OrderLots(), что некорректно. Надо использовать вместо него функцию KimIV GetLotLastClosePos()
hoz
1936
hoz 2012.09.10 12:34  

        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;

Я так понимаю op это и есть OrderType т.е. тип операции. Тогда возникает вопрос не по языку уже, а по логике. Зачем в коде условие:

op<0

Ведь типы операции бывают только от 0 до 5. Вот тут же написано https://docs.mql4.com/ru/constants/trading

Выходит по логике меньше нуля не может быть тип операции. p.s. Вот на данном примере хочу разобрать логику, которая уже меня измотала. Очень часто встречаю подобные моменты.

Дмитрий
1046
Дмитрий 2012.09.10 12:47  
hoz:

https://forum.mql4.com/ru/11287/page21



- Базин, о чем ты мечтаешь?

- Куртку теплую купить мечтаю... Серьезно, прошлую зиму в осенней пробегал - болел всю дорогу...

- На. Носи и мечтай о чем-нибудь великом...

hoz
1936
hoz 2012.09.10 13:11  
Я там уже был... По ссылке выложены скрипты KimIV'a. Но я задавал вопрос по логике. Там не уделяется внимания этому моменту.
Ihor Herasko
8462
Ihor Herasko 2012.09.10 15:34  
hoz:
Я там уже был... По ссылке выложены скрипты KimIV'a. Но я задавал вопрос по логике. Там не уделяется внимания этому моменту.

Дело в том, что приведенная функция - универсальная. Смотрите ее аргументы. Трейдера может не интересовать тип ордера. В этом случае он пропускает указание параметра op. В итоге параметр получает значение -1, что приводит к вечной истинности условия:

if (op<0 || OrderType()==op)
yvv4112
5
yvv4112 2016.11.23 21:55  
Нашел хороший вариант работы советника DayHL_Orders. Ставлю открытие ордеров: "Only Long"  оптимизирую и Прибыльность на паре EUR/USD доходит до 50% в месяц. Но есть одна проблема: надоели выскакивающие в терминале алерты:  "Невозможно установить OP_SELLLIMIT, цена слишком близка или выше High" и  "Невозможно установить OP_BUYLIMIT, цена слишком близка или ниже Low", которые не могу отключить пока не удалю советник с графика. Помогите как их убрать и что дописать или удалить в коде советника. Буду очень благодарен.  Может есть какие то ещё задумки доработки этого советника.Работу готов оплатить.  Пишите в личку:  yvv4112@gmail.com
Файлы:
Artem Ashikhmin
1257
Artem Ashikhmin 2016.11.24 00:32  
boraliht:

как в советник добавить функцию мартингейла? помогите прописать....советник ставит отложенные ордера по хай и лоу с тейк профитом и стопом, нужно чтобы после убыточного ордера он увеличивал объем по мартингейлу(Х2),после выигрыша начинал с минимального лота.

Попробуй так:

extern double  Lot = 0.1;
extern double  LotMult = 1.5;
//---------------------------+
double LotsNew,LotsAll;
int i;

void start() {

   double Orders          = 0;
   double LastProfitClose = 0;

   for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {    
      Orders++;            
      LotsAll=OrderLots();    
   }
   for(i=0;i<OrdersHistoryTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
      LastProfitClose=OrderProfit()+OrderSwap()+OrderCommission();
      }

//-------------------- если закрытие было убыточное, то увеличиваем лот --------------------+
   if(LastProfitClose<0 && Orders==0) {LotsNew=Lot*LotMult;}      else LotsNew=Lot;
   if(LastProfitClose<0 && Orders>0)  {LotsNew=LotsAll*LotMult;}  else LotsNew=Lot;
//------------------------------------------------------------------------------------------+

   if(Условия для открытия Buy){
   int send=OrderSend(Symbol(),отложенный ордер,NormalizeDouble(LotsNew,2),-,-,-,-,"-",Magic,0,Blue);
     }
   if(Условия для открытия Sell){
   send=OrderSend(Symbol(),отложенный ордер,NormalizeDouble(LotsNew,2),-,-,-,-,"-",Magic,0,Red);
     }

P.S.
OrderSend у тебя в коде свой, замени только стандартный лот на NormalizeDouble(LotsNew,2) ну и Lot, Magic тоже свой пропиши.

Artem Ashikhmin
1257
Artem Ashikhmin 2016.11.24 01:11  
yvv4112:
надоели выскакивающие в терминале алерты:  "Невозможно установить OP_SELLLIMIT, цена слишком близка, которые не могу отключить пока не удалю советник с графика. Помогите как их убрать и что дописать или удалить в коде советника. Буду очень благодарен.

Готово, ошибки поправил, алерты убрал.
Чтобы не было в дальнейшем ошибки 130, надо брать значения для установки стоп уровней хотя бы: спрейд вал.пары * 2 (т.е. если спрейд 17, то мин.уровень 30-35. а не 20)

Файлы:
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий