советник - разные вопросы - страница 32

 

(Прежде чем я попытался написать этот комментарий, я думаю, что я дико исследовал, чтобы найти решение, да, я нашел похожие темы, но я не нашел решения для этой проблемы. )

Я использую приведенный ниже код для ордера на продажу, который показывает мне Stop Loss в пунктах, он показывает мне правильное значение до тех пор, пока Stop Loss не станет положительным.
Поэтому у меня нет никаких идей, как я могу попробовать что-то сделать, чтобы решить эту проблему.

Любой хороший комментарий будет лучше, пожалуйста.
(Примечание: я не использую трейлинг-стоп в данный момент. Также приведенный ниже код только для обновления информации, а не для OrderSend() или подобных вещей. )

if(OrderType()==OP_SELL || (OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP))
  {
   riskinpips=change_to_pips(OrderStopLoss()-OrderOpenPrice());
  }
Print("stop loss in pips",DoubleToString(riskinpips,2));

Заранее спасибо.

Когда стоп-лосс приносит положительную прибыль

( примечание: скриншоты ярлыков сделаны программой фоторедактор для описания моей проблемы )
 

Наибольшее значение минус наименьшее значение дают результат, поэтому вы можете проверить, какое из них наибольшее.

if(OrderStopLoss()>OrderOpenPrice())
{
  // orderstoploss - orderopenprice
}

else if(OrderOpenPrice()>OrderStopLoss())
{
  // orderopenprice - orderstoploss
}
 
Marco vd Heijden:

Ну, это наибольшее значение минус наименьшее значение, которое дает вам результат, так что вы можете проверить, какой из них является наибольшим.

if(OrderStopLoss()>OrderOpenPrice())
{
  // orderstoploss - orderopenprice
}

else if(OrderOpenPrice()>OrderStopLoss())
{
  // orderopenprice - orderstoploss
}

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

Большое спасибо, мистер Марко.

 

#Profit Currency Calculate - Закрыто

Пока что работает идеально.
Большое спасибо @Marco vd Heijden и @whroeder1

 

#Время - Открыто

С тех пор как я начал исследовать вопрос о времени / часах для моего советника. Я вижу, что авторы используют для этого start() JUST в индикаторе.
Я использую OnTimer() и OnTick() в своем советнике, я не хотел бы использовать start().
Поэтому мне просто нужно убедиться / узнать, какая специальная функция будет лучше для функции времени и часов?

Я продолжу исследования по этому вопросу 10 часов спустя.
(примечание: я уже нашел несколько индикаторов времени и часов на странице Mql5.com Codebase - но я не люблю копировать и вставлять)

Любые хорошие комментарии, обмен форумом, ссылки и что-то еще было бы лучше для меня.

Заранее спасибо.

 

Функция start заменяется на OnStart только в скриптах. В советниках и индикаторах ее следует переименовать в OnTick и OnCalculate соответственно. Код, который должен выполняться во время работы программы mql5, должен находиться в этих трех функциях:

См.: https://www.mql5.com/en/docs/migration

Documentation on MQL5: Moving from MQL4
Documentation on MQL5: Moving from MQL4
  • www.mql5.com
Moving from MQL4 - Reference on algorithmic/automated trading language for MetaTrader 5
 
Marco vd Heijden:

Функция start заменяется на OnStart только в скриптах. В советниках и индикаторах ее следует переименовать в OnTick и OnCalculate соответственно. Код, который должен выполняться во время работы программы mql5, должен находиться в этих трех функциях:

Спасибо большое @Marco это очень познавательно для меня. Я уже прочитал "Переход с MQL4 на MQL5".
 
Max Enrik:

#Время - Открыто

С тех пор как я начал изучать вопрос о времени / часах для моего советника. Я вижу, что авторы используют start() JUST в индикаторе для этого.
Я использую OnTimer() и OnTick() в своем советнике, я не хотел бы использовать start().
Поэтому мне просто нужно убедиться / узнать, какая специальная функция будет лучше для функции времени и часов?

Я продолжу исследования по этому вопросу 10 часов спустя.
(примечание: я уже нашел несколько индикаторов времени и часов на странице Mql5.com Codebase - но я не люблю копировать и вставлять)

Любые хорошие комментарии, обмен форумами, ссылки и что-то еще было бы лучше для меня.

Заранее спасибо.

Используйте OnTimer().

Использование TimeLocal() даст лучший внешний вид, но не будет синхронизировано с часовым поясом брокера.

Использование TimeCurrent() будет синхронизировано с вашим брокером, но может отставать, а затем "прыгать" на секунды в зависимости от того, когда приходят тики. Этот пример продемонстрирует проблему:

#property strict

int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }

void OnTimer()
  {
   Comment(StringFormat("%s - Local\n%s - Broker",TimeToString(TimeLocal(),TIME_SECONDS),TimeToString(TimeCurrent(),TIME_SECONDS)));
  }
 

#Таймер - Закрыто

honest_knave:

Используйте OnTimer().
Использование TimeLocal() даст лучший внешний вид, но не будет синхронизировано с часовым поясом брокера.
Использование TimeCurrent() будет синхронизировано с вашим брокером, но может отставать и "прыгать" на секунды в зависимости от времени поступления тиков. Этот пример продемонстрирует проблему:

#property strict

int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }

void OnTimer()
  {
   Comment(StringFormat("%s - Local\n%s - Broker",TimeToString(TimeLocal(),TIME_SECONDS),TimeToString(TimeCurrent(),TIME_SECONDS)));
  }
Очень полезный комментарий. Большое спасибо.
 

Форум о трейдинге, автоматических торговых системах и тестировании торговых стратегий

советник - разные вопросы

honest_knave, 2016.11.30 01:28

ИМХО было бы лучше, если бы вы держали все расчеты лота вместе, а не разделяли их между OnChartEvent() и _lotCalc(). Одна функция, которая проверяет min / max / шаг и делает инкремент / декремент.

void OnChartEvent(const int      id     , // Event ID
                  const long   & lparam , // Parameter of type long event
                  const double & dparam , // Parameter of type double event
                  const string & sparam   // Parameter of type string events
                  )
{
    _lotCalc();
    //-------Process Button---------------------------------------------------------|
    if ( sparam == _btnLotMinus )
    {
        ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
        _lotSize = fmax(_lotMin, _lotSize-_lotStep);
        _calcUpdade( CALC_CHANGE_LOT );
        printf( " | Lot: %.2f  ", _lotSize );
        return;
    }   //---if Close
    //                          ...
}

void _lotCalc()
{
    //---
    _lotMin  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MIN  );
    _lotMax  = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_MAX  );
    _lotStep = SymbolInfoDouble( _Symbol, SYMBOL_VOLUME_STEP );

    //---
}

#Lot Step - ReOpen

@honest_knave- спасибо за вашу огромную помощь по поводу Lot Size и Lot Step.

Итак, мне просто нужно улучшить эту часть кода, чтобы когда "Размер лота >= (Шаг лота * 100)", шаг лота увеличивался на "Шаг лота * 100".

// lot plus
if(sparam==lotbuttonplus)
  {
   if(lotsize>=(lotstep*100))
     {
      lotstep=lotstep*100;
      Print("lot step: ",lotstep);
     }

   lotmaxdivide=lotmax/lotmax *(lotvalue*10);
   lotsize=fmin(lotmaxdivide,lotsize+(( ctrlfalse) ? lotstep*10 : lotstep));

// global variable
   infoupdate();

   printf("Lot: %.2f ",lotsize);
   ObjectSetInteger(0,sparam,OBJPROP_STATE,false);
   return;
  }

Заранее спасибо.