Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1901

 
Vitaly Muzichenko #:

Не знаю с чего начать

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
  int H=100;
  double b, a;
  if(prev_calculated==0) {
    ArrayInitialize(Buffer1,EMPTY_VALUE);
    ArrayInitialize(Buffer2,EMPTY_VALUE);
  }

  b=SymbolInfoDouble(Symbol(),SYMBOL_BID);
  a=SymbolInfoDouble(Symbol(),SYMBOL_ASK);

  if(rates_total-prev_calculated==1) {
    Buffer1[H+1]=EMPTY_VALUE;
    Buffer2[H+1]=EMPTY_VALUE;
  }
  else if (rates_total == prev_calculated) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала)
    ArrayCopy(Buffer1, Buffer1, 1, 0, H);
    ArrayCopy(Buffer2, Buffer2, 1, 0, H);
  }
  // записываем новые данные
  Buffer1[0]=b;
  Buffer2[0]=a;
  return(rates_total);
}

По идее, должно работать. Проверяйте. 

P.S. И напишите пожалуйста на сколько изменилась скорость работы варианта с функцией ArrayCopy. Мне самому это интересно.

 
Vitaly Muzichenko #:

Не знаю с чего начать

Вот вариант на mql5. Но только для цены Ask. Для Bid самостоятельно доделывайте.

Тут есть всё, и работа с индикаторным буфером, и работа с тиками, и пример как нет необходимости переворачивать индексацию индикаторного буфера.

На 1000 баров отображает вообще без задержек.

Файлы:
 
Alexey Viktorov #:

Вот вариант на mql5. Но только для цены Ask. Для Bid самостоятельно доделывайте.

Тут есть всё, и работа с индикаторным буфером, и работа с тиками, и пример как нет необходимости переворачивать индексацию индикаторного буфера.

На 1000 баров отображает вообще без задержек.

Принял! Спасибо!

 

Доброго времени, недавно начал разбираться с ЯП на МТ4 и столкнулся с таким моментом: не существует нормальной функции отслеживания закрытого ордера. У меня алгоритм простой: при появлении новой свечи - выставляется два отложенных ордера СТОПСЕЛЛ и БАЙСТОП, и мне нужно, что бы при закрытии одного из них - отслеживался закрытый (селлстоп или байстоп) и выставить один ордер взамен закрытого. Ордера выставляются - с этим проблем нет, но не могу понять - как отследить закрытые, набросал код, но в сообщении отображаtn только СЕЛЛСТОП, на БАЙСТОП не реагирует :


if (OrderSelect(OrdersHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY))
   {
   Print("OrderType", OrderType());//Тут всегда только только "1"
   }
   if(OrderType()==0)
    {
    Print("Закрылся  BUYSTOP:", OrderTicket());
    }
   if(OrderType()==1)
   {Print("Закрылся   SELLSTOP:",  OrderTicket());} //Тут сообщает корректно - номер ордера

И еще столкнулся с тем, что OnTrade или OnTradeTransaction не срабатывают , пробовал вот так:

void OnTradeTransaction()
 {
 Print("status - "); 
 }  
 
MixanM #:

Доброго времени, недавно начал разбираться с ЯП на МТ4 и столкнулся с таким моментом: не существует нормальной функции отслеживания закрытого ордера. У меня алгоритм простой: при появлении новой свечи - выставляется два отложенных ордера СТОПСЕЛЛ и БАЙСТОП, и мне нужно, что бы при закрытии одного из них - отслеживался закрытый (селлстоп или байстоп) и выставить один ордер взамен закрытого. Ордера выставляются - с этим проблем нет, но не могу понять - как отследить закрытые, набросал код, но в сообщении отображаtn только СЕЛЛСТОП, на БАЙСТОП не реагирует :

//+----------------------------------------------------------------------------+
int LastClose()
  {
   int result=-1;
   datetime t=0;
   int i=OrdersHistoryTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderType()==OP_BUY||OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime())
                 {
                  t=OrderCloseTime(); result=OrderType();
                 }
              }
           }
        }
     }
   return(result);
  }
//+----------------------------------------------------------------------------+

MixanM #:

И еще столкнулся с тем, что OnTrade или OnTradeTransaction не срабатывают , пробовал вот так:

Это вроде для МТ5
 
Всем здравствуйте друзья.
Такой вот вопрос.
Копирование сделок на этом сервисе за столько лет не изменилось. Давно сложилось впечатление что разработчикам совсем не интересно думать над удобством его посетителям.
Понадобилась нужда своего проекта.

Я не знаю возможно ли это ?

1) Нужен копировщик сделок,  ( советник) Не знаю какая нагрузка и в чем она измеряется , необходимо что бы он мог копировать с одного и раздавать более чем на сто счетов .
Вопрос о копирование. Например что бы лот на сделки, исходил из процентов сделки ( ну может оно так и есть я этого не знаю))  То есть у меня на счету 100 у подписчика на счету 1000, я открываю сделку на 3% от депо, и у него лотность пересчитывается по проценту от моей сделки.  Стало быть у меня на 3% это 3 доллара а у подписчика сделка открывается соответственно, на 3%  = 30 долларов.


2) Возможно ли вытаскивать данные счета подписчика. То есть имя фамилия, но самое главное сумма на балансе? Если не возможно вытаскивать всю информацию тогда что можно?

3) Уважаемые программисты, оцените примерную стоимость такой работы, не хочется быть обманутым хочу понимать адекватную цену.
Спасибо!
 
Roman Voloshchuk #:
Всем здравствуйте друзья.
Такой вот вопрос.
Копирование сделок на этом сервисе за столько лет не изменилось. Давно сложилось впечатление что разработчикам совсем не интересно думать над удобством его посетителям.
Понадобилась нужда своего проекта.

Я не знаю возможно ли это ?

1) Нужен копировщик сделок,  ( советник) Не знаю какая нагрузка и в чем она измеряется , необходимо что бы он мог копировать с одного и раздавать более чем на сто счетов .
Вопрос о копирование. Например что бы лот на сделки, исходил из процентов сделки ( ну может оно так и есть я этого не знаю))  То есть у меня на счету 100 у подписчика на счету 1000, я открываю сделку на 3% от депо, и у него лотность пересчитывается по проценту от моей сделки.  Стало быть у меня на 3% это 3 доллара а у подписчика сделка открывается соответственно, на 3%  = 30 долларов.


2) Возможно ли вытаскивать данные счета подписчика. То есть имя фамилия, но самое главное сумма на балансе? Если не возможно вытаскивать всю информацию тогда что можно?

3) Уважаемые программисты, оцените примерную стоимость такой работы, не хочется быть обманутым хочу понимать адекватную цену.
Спасибо!

Данные о подписчике вынимать вредно.

Опять-же, у вас на счету 50 с плечом 500, а у подписчика 5000 с плечом 33.

Тут как-бы есть небольшие проблемы с расчётами. Это если говорить о данном сервисе.

Если говорить о самокопировании, то:

у вас на счету 50 с плечом 2000, а у подписчика 5000 с плечом 33

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

---

Не так всё просто.

 

Tretyakov Rostyslav #:
Это вроде для МТ5С

Спасибо за код, но ваш тоже почему то возвращает только чётные ордера (СЕЛЛСТОП), не могу понять почему так, может сортировка неверная/ (Прогоняю код в тестере - может в этом проблема?)

 
MixanM #:

Спасибо за код, но ваш тоже почему то возвращает только чётные ордера (СЕЛЛСТОП), не могу понять почему так, может сортировка неверная/ (Прогоняю код в тестере - может в этом проблема?)

мой код возвращает тип последнего закрытого ордера - "0-Buy" или "1-Sell"
 
Tretyakov Rostyslav #:
мой код возвращает тип последнего закрытого ордера - "0-Buy" или "1-Sell"

Ну да, я это и имел ввиду - что он возвращает данные только по ордеру "селлстоп". Я в ваш добавил вот это еще просто для визуальной проверки: 

...

if(t<OrderCloseTime())

                 {

                  t=OrderCloseTime(); result=OrderType();

                  Print("Order TIP :", OrderTicket());

                 }

....

Причина обращения: