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

 
Vitaly Muzichenko #:

Вклинюсь :)

Есть индекс DAX30 = котируется с 9 до 22

Каким способом узнать, сколько баров в сессии на Таймфейме М15, Н1 и др.

Maxim Kuznetsov #:

(22*3600-9*3600)/PeriodSeconds(M15)

но это в идеале - "столько баров должно быть в промежутке от 9:00 до 22:00".

Чем меньше таймфрейм, тем сильнее погрешность, в реальности их почти всегда меньше выходит. Не получится по истории считать "каждые N баров - следующая сессия"

Всё гораздо проще…

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

добрый день всем.

нужна ваша помощь.

В советник встроена ф-я подсчета текущего профита:

double GetProfitFromStart()
  {
   double lp=0,cp=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(lp+cp);
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL("nextlot"   ,1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
      DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
       DrawLABEL("lab_Take" ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2)));
      TrailingOrders();
   }

void OnTick составлен как указано выше.

Как сделать сброс счетчика профита на 0,0 при выполнении условий:

if(CountOrders()==0) && (GetProfitFromStart()>0

то есть все ордера закрыты и общий профит при закрытии последнего ордера был >0???

 

Установил MT4. Не сохраняет котировки после закрытия терминала - каждый раз загружает по новой. 

 

 
Maxim Kuznetsov #:

даже в 4-ке лучше "сперва открыть, потом модифицировать".

Не все позволяют открываться по рынку с одновременным выставлением Стоп-Лосс.

кстати и Стоп-Лосс не везде бывает. Он-же стоповый ордер, отрабатывается на сервере брокера, это его личная услуга (заслуга, риск, заработок) а не где вы себе возомнили, нет торгового стакана стоповых ордеров. 

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

 
законопослушный гражданин #:

добрый день всем.

нужна ваша помощь.

В советник встроена ф-я подсчета текущего профита:

void OnTick составлен как указано выше.

Как сделать сброс счетчика профита на 0,0 при выполнении условий:

if(CountOrders()==0) && (GetProfitFromStart()>0

то есть все ордера закрыты и общий профит при закрытии последнего ордера был >0???

Как то не понятна задача. Фукция подсчета каждый раз начинает перебирать ордера/позиции и суммирует профиты с нуля.

 double lp=0,cp=0;

Что Вы хотите обнулять? Если у Вас не будет открытых позиций/рыночных ордеров, то функция подсчета вернет ноль. Сама обнулится)))

 
законопослушный гражданин #:

добрый день всем.

нужна ваша помощь.

Как сделать сброс счетчика профита на 0,0 при выполнении условий:

то есть все ордера закрыты и общий профит при закрытии последнего ордера был >0???

Что именно из этого не получается? 

 
Есть существующий торговый робот на МТ4, добавляю код с привязкой к торговому счету, но всё равно не получается. Выбивает ошибку. Нужен человек который поможет это сделать. мой телеграмм @Starinkov я буду оочень признателен)))
 

Доброго времени. Просьба помочь. 

Ищу закрытые ордера с отрицательной доxодностью.
По итоги пропускает, получаю результат не всеx отрицательныx ордеров. 

Учусь писать.

double Minus_profit(){
 for (int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
          if (OrderCloseTime()>=time && OrderTicket()>ticket){
            if (OrderProfit()+OrderSwap()+OrderCommission()<0){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}}return(result);
}
 
Alexander Avksentyev #:

Доброго времени. Просьба помочь. 

Ищу закрытые ордера с отрицательной доxодностью.
По итоги пропускает, получаю результат не всеx отрицательныx ордеров. 

Учусь писать.

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

OrderCloseTime()>=time

т.к. остальные позиции имеют меньшее время закрытия. Это все будет зависеть от сортировки, но в стандартной сортировке вылезет именно эта проблема


И еще исправьте это условие

(OrderType() == OP_BUY || OP_SELL)

на

(OrderType() == OP_BUY || OrderType() == OP_SELL)

ах да.. на сколько помню, если позицию брать из истории, то в OrderProfit() уже будет хранится конечный результат со свопами и комиссия. В открытых позициях - нет, все суммировать надо. Но это не точно, проверьте. 

 
Nikita Chernyshov #:

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

т.к. остальные позиции имеют меньшее время закрытия. Это все будет зависеть от сортировки, но в стандартной сортировке вылезет именно эта проблема


И еще исправьте это условие

на

ах да.. на сколько помню, если позицию брать из истории, то в OrderProfit() уже будет хранится конечный результат со свопами и комиссия. В открытых позициях - нет, все суммировать надо. Но это не точно, проверьте. 

Спасибо. так работает норм.

double Minus_profit(){
time=TimeCurrent();
 for (int i=0; i<OrdersHistoryTotal(); i++){
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol() && OrderMagicNumber()==Magic){
        if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
          if (OrderProfit()+OrderSwap()+OrderCommission()<=0){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}}return(result);
}

далее; когда попадается ордер с положительным профитом, надо обнулить result и искать дальше отрицательные.