Ваши вопросы по языку MQL4

griz

Активный участник
Ребят, помогите составить формулу. Задача следующая:

Есть 3 ордера. Совокупный убыток по ордерам 10%. Ордер №2 и каждый последующий ордер больше предыдущего на 1%. Как рассчитать, какой процент у каждого ордера? Всех с Новым Годом.
 

Ugar

Гуру форума
Ребят, помогите составить формулу. Задача следующая:

Есть 3 ордера. Совокупный убыток по ордерам 10%. Ордер №2 и каждый последующий ордер больше предыдущего на 1%. Как рассчитать, какой процент у каждого ордера? Всех с Новым Годом.
1. Выбрать ордер.
2. Получить его прибыль. Лучше с учётом свопов и комиссий. Убыток это отрицательная прибыль.
3. Вычислить %.
Всё это в цикле, перебирая все нужные ордера.
 

griz

Активный участник
1. Выбрать ордер.
2. Получить его прибыль. Лучше с учётом свопов и комиссий. Убыток это отрицательная прибыль.
3. Вычислить %.
Всё это в цикле, перебирая все нужные ордера.
Что-то я не пойму. Давайте тогда на другом примере.

Есть 3 яблока. Совокупно они стоят 10 руб. Второе яблоко и каждое последующие(2-е и 3-е яблоко) больше предыдущего на 1 руб. Сколько стоит каждое яблоко? Можно поподробнее?

a = ?;
b = a + 1;
c = b + 1;

10 = a + b + c;
 
Последнее редактирование:

Ugar

Гуру форума
Что-то я не пойму. Давайте тогда на другом примере.

Есть 3 яблока. Совокупно они стоят 10 руб. Второе яблоко и каждое последующие(2-е и 3-е яблоко) больше предыдущего на 1 руб. Сколько стоит каждое яблоко? Можно поподробнее?
Зачем изобретать деревянный велосипед и что то считать, если на каждом яблоке есть ценник?
Есть функция, которая сразу вернёт прибыль ордера, без всякий совокупностей. Останется посчитать % относительно чего там надо.
 

Ugar

Гуру форума
Прибыль ордера в валюте депозита = OrderProfit();
А с учётом свопов и комиссий = OrderProfit()+OrderSwap()+OrderCommission();
 

griz

Активный участник
Прибыль ордера в валюте депозита = OrderProfit();
А с учётом свопов и комиссий = OrderProfit()+OrderSwap()+OrderCommission();
Я вопрос неправильно задал, сорри. Нужно выставить 3 ордера. Совокупный убыток по ордерам 10%. Ордер №2 и каждый последующий ордер больше предыдущего на 1%. Как рассчитать, какой процент у каждого ордера?
 

1_Lexa

Активный участник
Код:
   }
              Trailing();
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

void Trailing()
  {
   for(int i=OrdersTotal() -1; i>=0; i--)
     {
      ticket=OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0);
                    {
                     ticket=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop * Point, Digits),0,0);
                        Print("Ошибка модификации ордера на покупку");
                    }
                 }
              }
            if(OrderType() == OP_SELL)
              {
               if(OrderOpenPrice() - Ask > TrailingStop * Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() > Ask + (TrailingStep + TrailingStop) * Point || OrderStopLoss() == 0)
                    {
                     ticket=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStop * Point, Digits),0,0);
                     Print("Ошибка модификации ордера на продажу");
                        
                    }
                 }
              }
           }
        }
     }
     ticket=0;
     }
Набросал советника - тральщика профита. Его можно отдельно использовать или вытащить из него код.
Попробовал ваш в советнике, не работает. Использовал такой, оказался более рабочим
 

ИванМН

Местный знаток
Всех приветствую.
В MQL4-советнике возможно как-либо отследить начало или окончание оптимизации этого советника в тестере стратегий? Тестер отдаёт информацию о прогонах? Мне нужно, чтобы в начале первого прогона оптимизации советник создавал некую глобальную переменную, а по окончании последнего прогона удалял её.
 

griz

Активный участник
Ребят, помогите составить формулу. Задача следующая:

Нужно выставить 3 ордера. Совокупный убыток по ордерам 10%. Ордер №2 и каждый последующий ордер больше предыдущего на 1%. Как рассчитать, какой процент у каждого ордера? Всех с Новым Годом.
В общем, некое решение нашел, в коде считается вроде как правильно:
C#:
double stop = 10.0;
double percent = 1;
int orders = 3;
double res = 0;
double sum = 0;

if(orders == 2)
  {
   for(int i=1; i<=orders; i++)
     {
      if(i == 1)
        {
         res = (stop - percent) / orders;
        }
      else
        {
         res = res + percent;
        }

      sum = sum + res;

      Print("Ордер ",i,": ",res,"%");
     }
  }
else
   if(orders == 3)
     {
      for(int i=1; i<=orders; i++)
        {
         if(i == 1)
           {
            res = (stop - orders * percent) / orders;
           }
         else
           {
            res = res + percent;
           }

         sum = sum + res;

         Print("Ордер ",i,": ",res,"%");
        }
     }
Print("sum=",sum);

Результат:
Ордер 1 = 2.33%
Ордер 2 = 3.33%
Ордер 3 = 4.33%

К сожалению, не получилось составить универсальную формулу, из-за того, что под определенное кол-во ордеров идет своя формула.
 

ZenFX

Почетный гражданин
Есть вот такая задача ). ЗАЩИТА от разрыва связи, ну то есть разрыва котировок ). Как это решается господа ПРОФИ в программирование на MQL4 ВАМ вопрос ). Эксперт пересчитывает от более позднего бара к более новому, происходит разрыв связи допустим на несколько баров, мы имеем последний посчитанный бар. Допустим был разрыв на 5 баров, теоретически после того как связь возобновилась НАШ первый бар должен стать ШЕСТЫМ, ну он по прежнему первый (iBarShift у этого времени такой), а нулевой бар тот который только что пришёл (iBarsShift у него 0), ТАК ВОТ ЗАДУМАНО у МЕТАКВОТЕСОВ, по непонятной "хитрой" задумке ), потом пара тиков, и он становится шестым. Не замечали такого нет ? Как с этим бороться ? Если конечно замечали такое ).
 

mobidik

-----
Есть вот такая задача ). ЗАЩИТА от разрыва связи, ну то есть разрыва котировок ). Как это решается господа ПРОФИ в программирование на MQL4 ВАМ вопрос ). Эксперт пересчитывает от более позднего бара к более новому, происходит разрыв связи допустим на несколько баров, мы имеем последний посчитанный бар. Допустим был разрыв на 5 баров, теоретически после того как связь возобновилась НАШ первый бар должен стать ШЕСТЫМ, ну он по прежнему первый (iBarShift у этого времени такой), а нулевой бар тот который только что пришёл (iBarsShift у него 0), ТАК ВОТ ЗАДУМАНО у МЕТАКВОТЕСОВ, по непонятной "хитрой" задумке ), потом пара тиков, и он становится шестым. Не замечали такого нет ? Как с этим бороться ? Если конечно замечали такое ).
Во первых: не эксперт, а индикатор.
Во вторых: все сказано в справке: Функции обработки событий
Надеюсь, Вы используете в коде OnCalculate(), а не start().
 

Вложения

  • OnCalculate.png
    OnCalculate.png
    35,5 КБ · Просмотры: 11
Последнее редактирование модератором:

ZenFX

Почетный гражданин
Нет не индикатор а эксперт именно. Я именно я считаю в эксперте от последнего бара к новому бару... ) Я считаю по iBarShift и при приходе нового тика, после разрыва этот iBarShift = 1, а у нулевого бара iBarShift = 0, а между ними еще 5 баров, а потом еще пару тиков задержка и он становится 6 у этого старого бара, типа того примерно ). ЗАЧЕМ это так сделано ) нипонятно ). Я примерно понимаю что надо подождать пару тиков ))) ну это то мне тоже зачем ))).
 
Последнее редактирование:

mobidik

-----
Нет не индикатор а эксперт именно.
связь возобновилась НАШ первый бар должен стать ШЕСТЫМ, ну он по прежнему первый (iBarShift у этого времени такой), а нулевой бар тот который только что пришёл (iBarsShift у него 0), ТАК ВОТ ЗАДУМАНО у МЕТАКВОТЕСОВ, по непонятной "хитрой" задумке ), потом пара тиков, и он становится шестым.
Все верно, пока не будут заполнены пробелы по времени самими барами, отрисоваными, на графике - первый не станет шестым. Ведь, например М1, если разрыв между барами по времени 3 мин., то их нумерация не перескакивает через 3.
 

mobidik

-----
Всех приветствую.
В MQL4-советнике возможно как-либо отследить начало или окончание оптимизации этого советника в тестере стратегий? Тестер отдаёт информацию о прогонах? Мне нужно, чтобы в начале первого прогона оптимизации советник создавал некую глобальную переменную, а по окончании последнего прогона удалял её.
В OnInit() создавать глобальную переменную при оптимизации:
C-подобный:
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 {
  if(IsOptimization())
   {
     if(!GlobalVariableCheck("Start"))
      GlobalVariableSet("Start",1);
   }
 }
А по окончанию прогона удалить её:
C-подобный:
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(IsOptimization())
   {
     GlobalVariableDel("Start");
   }
}
если прогон окажется не последним - глобальная будет создана снова.
 

ZenFX

Почетный гражданин
Ну какие идеи ? )) Пару тиков ждать ? А если выходной и их нету ? А отрисовать эксперт что-то должен. Или метаквотесам надо чота поменять )))) и реализовать нормально приход нового тика после разрыва ?
 

ZenFX

Почетный гражданин
ПФФФФ а чо думать то )) по изменению iBarShift первого бара смотреть, предыдущее состояние "евойное" сохранить и потом сравнить их ))))))))))) изменился и насколько. От блин )). А я просто короче брал новый пришедший бар и считал его последним ))). Ну не написал - не задумался бы, а еслиб не было у меня разрывов связи, как не было 100 лет и вообще не подумал бы об этом ).
 

mobidik

-----
Ну какие идеи ? )) Пару тиков ждать ? А если выходной и их нету ? А отрисовать эксперт что-то должен. Или метаквотесам надо чота поменять )))) и реализовать нормально приход нового тика после разрыва ?
А причем тут метаквоты? Инфа в терминале обновляется по приходу нового тика от брокера - брокер молчит - терминал не шевелится.
Коль часто случаются обрывы связи - сменить провайдера...
А так, контролировать состояние связи с брокером. Для этого есть ф-ция: IsConnected(). После того, как будет восстановлена связь с брокером - пересчитать нужное количество последних баров.
 
Верх