Главная
Форум
MQL программирование, помощь, доработки

Для того, чтобы использовать все возможности сайта, мы рекомендуем Вам person_add Зарегистрироваться или person Войти

  • Страница 1 из 1
  • 1
Форум » Cтратегии и программирование на MQL » MQL программирование, помощь, доработки » Прошу помощи в реализации некоторых функций в советнике
Прошу помощи в реализации некоторых функций в советнике
Дата: Пятница, 14.01.2011, 17:45 | Сообщение # 1 Написал: Автор Nik7
Группа: Пользователи
Сообщений: 4
Награды: 0
Статус: Оффлайн

Добрый день!

Хочу добавить в эксперт при получении минуса - умножение лотов начиная с лота 0.01 с любым дробным коэф.
И добавить возможность регулировки начала этого умножения.
т.е. чтоб можно было выберать количество отрицательных сделок после которых начинает работать умножение лотов.

Я не программист но понемногу пытаюсь всеже во всем разобраться smile
Я пробывал разные варианты умножения но оптимального решения не нашел
Трудности в следующем:
При умножении обычным способом в советнике через переменную все какбы работает хорошо. Но при перезапуске советника информация в переменной о текущем лоте теряется и лот сбрасывается в начальный. еслиб можно было гдето хранить эту переменную даже при выключении терминала и последующем включении возобновлять ее это было бы решением. Но такого способа я незнаю пока.
Как вариант это брать лот из истории по последнему закрытому лоту
j = OrdersHistoryTotal()-1;
if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber() == magic && OrderSymbol() == Symbol() && OrderProfit() < 0 )
{
Lot = OrderLots();
Lot=Lot*koef;}
Так тоже работает и теминал после выключения нормально подхватывает лот. Но полноценно он работает только с лотом начиная с 0.04 или же с любым лотом но коэф. умножения должен быть целым числом.
это и за того что лот в истории всегда вида x.xx а для его нормального умножения начиная с лота 0.01 и коэф умножения например 1.3 лот в истории необходим вида x.xxx
из за этого лот просто не умножается.

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

И второй вопрос это возможность регулировки числа отрицательных сделок с лотом 0.01 после которых начинается умножение. Решения нормального тоже не нашел.

как вариант оба вопроса реализовал так:
j = OrdersHistoryTotal()-1;
if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber() == 777 && OrderSymbol() == Symbol() && OrderProfit() < 0 )
{
Lot = OrderLots();
if (Lot<0.04)
{Lot=koefmini*b; b=Lot;}
if (Lot>0.04)
{Lot=Lot*koef; b=0.01;}
}
Оно работает... Но если перезапустить терминал при лоте меньшем 0.04 то он сбросится в начальный. если лот 0.04 и более работает нормально так как с истории берет.
ну и через koefmini можно задать меньшее число по сравнению с koef тогда лот растет медленее до 0.04 это как альтернатива регулировки начала умножения лота через основной koef. Но хотелось бы реализовать конечно это в виде просто переменной где указывается число по достижению которого начинает работать умножение.

attach_file Прикрепления

Sovetnik.mq4 (2.5 Kb)

Дата: Пятница, 14.01.2011, 22:32 | Сообщение # 2 Написал: Администратор expforex
Группа: Администраторы
Сообщений: 9910
Награды: 42
Статус: Оффлайн

есть функция определения последней позы, закрыта ли она по стопу.:

Code

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);
}

ее можно использовать в мартине так:

Code
  
Lot2=Lots;
    if (lastlot<Lot2)lastlot=Lot2;
    if (isCloseLastPosByStop(Symbol(),-1,Magic))lastlot=lastlot*Martin;
    if (!isCloseLastPosByStop(Symbol(),-1,Magic))lastlot=Lot2;
     
    Lot2=lastlot;

Lot2 в данном случае возвращает лот для позиции.
Lots - в данном случае стандартный лот

Martin - коеф увеличения

Дата: Понедельник, 17.01.2011, 17:34 | Сообщение # 3 Написал: Автор Nik7
Группа: Пользователи
Сообщений: 4
Награды: 0
Статус: Оффлайн

Спасибо. попробую внедрить.
А по второму вопросу какието идеи есть?

Добавлено (17.01.2011, 17:34)
---------------------------------------------
Попробывал я эту функцию... Но как я понял она просто возвращает значение последнего закрытого ордера закрылся он по стопу или нет. и в зависимости от этого лот умножается или нет.
Но это проблему не решает это по сути все тоже что и было у меня в разных вариантах но в другом исполнении.
В данном случае опять же если установлен ордер с лотом к примеру 0.02 и коэф 1.3 то при перезагрузке терминала лот при следующем ордере возмет с истории 0.02 и получится 0.02*1.3=0,026 но оно округлится и в терминал попадет именно 0.02. потои все по кругу. т.е. из за того что не хватает 3знака после запятой получается лот застрянет на 0.02 и рости не будет.
Если лот брать не из зистории то да он растет нормально. но он потеряется при перезагрузке МТ. и начнет снова с начального.
Может я чтото не так делаю? :)) подскажите

Дата: Понедельник, 17.01.2011, 18:14 | Сообщение # 4 Написал: Администратор expforex
Группа: Администраторы
Сообщений: 9910
Награды: 42
Статус: Оффлайн

Quote (Nik7)
Попробывал я эту функцию... Но как я понял она просто возвращает значение последнего закрытого ордера закрылся он по стопу или нет. и в зависимости от этого лот умножается или нет.

ну да.

хранить переменную можно например в глоб переменной, функции:

GlobalVariableCheck
GlobalVariableDel
GlobalVariableGet
GlobalVariableName
GlobalVariableSet
GlobalVariableSetOnCondition
GlobalVariablesDeleteAll
GlobalVariablesTotal

Дата: Вторник, 18.01.2011, 19:32 | Сообщение # 5 Написал: Автор Nik7
Группа: Пользователи
Сообщений: 4
Награды: 0
Статус: Оффлайн

Спасибо за подсказку - именно этого не хватало rah

Дата: Вторник, 18.01.2011, 22:21 | Сообщение # 6 Написал: Администратор expforex
Группа: Администраторы
Сообщений: 9910
Награды: 42
Статус: Оффлайн

глобальные переменные тоже капризные, так что с ними надо быть поаккуратнее

Дата: Четверг, 20.01.2011, 01:22 | Сообщение # 7 Написал: Автор Nik7
Группа: Пользователи
Сообщений: 4
Награды: 0
Статус: Оффлайн

А в чем там проблемы бывают? послежу конечно как оно вести себя будет.

Форум » Cтратегии и программирование на MQL » MQL программирование, помощь, доработки » Прошу помощи в реализации некоторых функций в советнике
  • Страница 1 из 1
  • 1
Поиск:
Expforex Expforex Идеи для Metatrader https://www.expforex.com/1NEWDESIGN/NEWLOGO/LOGONEW.png expforex@meta.ua Украина expforex2