Скачать MetaTrader 5

как дописать функцию

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

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

Файлы:
Vladislav Andruschenko
101876
Vladislav Andruschenko  

Если последняя сделка убыточная - умножаем лот последней сделки на 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
1934
hoz  

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

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

khorosh
9424
khorosh  
hoz:

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

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

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

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

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

        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
Дмитрий  
hoz:

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



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

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

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

hoz
1934
hoz  
Я там уже был... По ссылке выложены скрипты KimIV'a. Но я задавал вопрос по логике. Там не уделяется внимания этому моменту.
Ihor Herasko
12248
Ihor Herasko  
hoz:
Я там уже был... По ссылке выложены скрипты KimIV'a. Но я задавал вопрос по логике. Там не уделяется внимания этому моменту.

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

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

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

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