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

 
Aleksandr Slavskii #:

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

о! Спасибо вам большое! тоже взял к себе в копилку и в работу (тоже оптить потом надо будет для краткосрока.....)

 
Vladislav Boyko #:

Не знал, что существует такое время.

[edit]

23 часа разницы между 00:00 и 24:00. Похоже, оно работает не совсем так, как вы ожидаете

Вы правы, так корректнее будет

   startTime=StringToTime(StartTime);
   if(StartTime=="") startTime=StringToTime("00:00");

   stopTime=StringToTime(StopTime);
   if(StopTime=="") stopTime=StringToTime("23:59:59")+1;
   Print(startTime,"/",stopTime);
2025.04.06 08:20:08.454 EURUSD,H1: 2025.04.06 00:00:00/2025.04.07 00:00:00
 

Есть матрица, допустим, размером 4х4.

Как получить значение из строки 2, колонки 2 ? (отчёт с нуля)

Для двумерного массива array[4][4] это будет просто: value=array[2][2];

А как это сделать для матрицы?

 
Artyom Trishkin #:

Есть матрица, допустим, размером 4х4.

Как получить значение из строки 2, колонки 2 ? (отчёт с нуля)

Для двумерного массива array[4][4] это будет просто: value=array[2][2];

А как это сделать для матрицы?

А в чём подвох? Вроде бы также.

matrix X = {{2.1, -1.8, -1.9}, {-1.7, 2.3, -1.5}, {-1.0, -1.2, 5.3}};
double v = X[2][2];
Print(X);
Print(v);

2025.04.07 07:18:16.673    test_matrix (EURUSD,D1)    [[2.1,-1.8,-1.9]
2025.04.07 07:18:16.673    test_matrix (EURUSD,D1)     [-1.7,2.3,-1.5]
2025.04.07 07:18:16.673    test_matrix (EURUSD,D1)     [-1,-1.2,5.3]]
2025.04.07 07:18:16.673    test_matrix (EURUSD,D1)    5.3

 
Aleksey Nikolayev #:

А в чём подвох? Вроде бы также.

2025.04.07 07:18:16.673    test_matrix (EURUSD,D1)    [[2.1,-1.8,-1.9]
2025.04.07 07:18:16.673    test_matrix (EURUSD,D1)     [-1.7,2.3,-1.5]
2025.04.07 07:18:16.673    test_matrix (EURUSD,D1)     [-1,-1.2,5.3]]
2025.04.07 07:18:16.673    test_matrix (EURUSD,D1)    5.3

А, да?

А я ищу в методах матриц ...

 

Всем добрый день. Пытаюсь написать очередной Грааль JJJ. Мне нужно рассчитать лот так чтобы если в настройках я отключил стоп и профит ордера открывались без стопа и профита. А если включил то стоп и профит ставятся в пунктах, а лот рассчитывается в проценте от депозита.  Пробую сделать так. Выше он тика у меня объявлены все переменные которые понадобиться для расчёта лота вот так.

//-ПЕРЕМЕННЫЕ ДЛЯ РАСЧЁТА ЛОТА НАЧАЛО------------------------------------------------------------------------------------------------+
        double min_lot= MarketInfo(Symbol(), MODE_MINLOT);  // МИНИМАЛЬНЫЙ ЛОТ У БРОКЕРА
   double max_lot= MarketInfo(Symbol(), MODE_MAXLOT);       // МАКСИМАЛЬНЫЙ ЛОТ У БРОКЕРА
   double stoplevel= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point; // УРОВЕНЬ СТОП ЛЕВЕЛА У БРОКЕРА
   double sl= 0;
   double tp= 0;
   double lot= min_lot;
double free= AccountFreeMargin(); // СВОБОДНЫЕ СРЕДСТВА ДЛЯ РАСЧЁТА ЛОТА
    double lot_val= MarketInfo(Symbol(), MODE_TICKVALUE); // СТОИМОСТЬ 1 ПУНКТА
    double step= MarketInfo(Symbol(), MODE_LOTSTEP); // ШАГ ИЗМЕНЕНИЯ РАЗМЕРА ЛОТА
    
      


//----ПЕРЕМЕННЫЕ ДЛЯ РАСЧЁТА ЛОТА КОНЕЦ---------------------------------------------------------------------------------------------+


Далее идёт он тик с определением новой свечи, получение ордеров бай и селл.

void OnTick()
  { if(f__Is_new_candel())
 {//---НОВАЯ СВЕЧА НАЧАЛО
  //----- ОН ТИК НАЧАЛО
   int count_orders_buy= f__count_orders(_Symbol, 0, Magik_number);//ПОЛУЧАЕМ КОЛИЧЕСТВО БАЙ ОРДЕРОВ
   int count_orders_sell= f__count_orders(_Symbol, 1, Magik_number); // ПОЛУЧАЕМ КОЛИЧЕСТВО СЕЛЛ ОРДЕРОВ


Ниже идёт блок кода при отключении стопа и профита.

    // --------------------------ЛОТ ПРИ ОТКЛЮЧЕНИИ СТОПА И ПРОФИТА НАЧАЛО-----------------------------------------------------/
    // ЛОТ ПРИ ОТКЛЮЧЕНИИ СТОПА И ПРОФИТА
if(On_or_of_tp_sl == en_off_tp_and_sl)
{
    sl= 0;
    tp= 0;
       lot = Lot;

    // пРОВЕРЯЕМ, ЕСЛИ УКАЗАННЫЙ ЛОТ МЕНЬШЕ МИНИМАЛЬНО ВОЗМОЖНОГО
    if(lot < MarketInfo(Symbol(), MODE_MINLOT))
    {
        lot = MarketInfo(Symbol(), MODE_MINLOT); // Присваиваем минимально возможный лот
    }


}
// --------------------------ЛОТ ПРИ ОТКЛЮЧЕНИИ СТОПА И ПРОФИТА КОНЕЦ------------------------------+


После этого идёт код расчёта лота при включенном стопе и профите- стоп и профит расчитывается в  пунктах, а лот считается в проценте от депозита с помощью 2 функций вот таким макаром

 //---ФУНКЦИЯ РАСЧЁТА ЛОТА В ПРОЦЕНТАХ ОТ ДЕПОЗИТА ПРИ SL НОВАЯ НАЧАЛО----------------------------------------------------------------------------------------------+

double f__lot_as_a_percentage_of_deposit_new()
{//--ФУНКЦИЯ ЛОТА НАЧАЛО
if(On_or_of_tp_sl== en_off_tp_and_sl)// ЕСЛИ СТОП И ПРОФИТ ВЫКЛЮЧЕНЫ ОТКРЫВАЕМСЯ ЛОТОМ ВБИТЫМ В ПЕРЕМЕННУЮ ЛОТ
{
double lokal_lot_fix_lot= f__fix_lot(Lot);
return lokal_lot_fix_lot;
}
 else
if(On_or_of_tp_sl== en_on_tp_and_sl)
{
double lokal_lot_v_percentage= f__lot_as_a_percentage_of_deposit(Max_risk, sl);
return lokal_lot_v_percentage;

}
Print("НЕПОНЯТНО КАК РАСЧИТЫВАТЬ ЛОТ- СТАВИМ МИНИМУМ");
return min_lot;
}//--- ФУНКЦИЯ ЛОТА КОНЕЦ



//-----ФУНКЦИЯ РАСЧЁТА ЛОТА В ПРОЦЕНТАХ ОТ ДЕПОЗИТА ПРИ SL НОВАЯ КОНЕЦ--------------------------------------------------------------------------------------------+


//---ФУНКЦИЯ РАСЧЁТА ЛОТА В ПРОЦЕНТАХ ОТ ДЕПОЗИТА ПРИ SL НАЧАЛО----------------------------------------------------------------------------------------------+
double f__lot_as_a_percentage_of_deposit(double param_Max_risk, double param_sl= 0)
{
param_sl= f__stop_los_in_points(Sl);// 
   // Проверка на нули — защита от деления на 0
   if (param_sl == 0 || Point == 0 || lot_val == 0 || step == 0)
   {
      Print("ОШИБКА: sl, Point, lot_val или step равен нулю — возврат минимального лота!");
      return min_lot;
   }

   double lot_as_a_percentage_of_deposit = MathFloor((free * param_Max_risk / 100) / (param_sl / Point * lot_val) / step) * step;
   return lot_as_a_percentage_of_deposit;
}
//-----ФУНКЦИЯ РАСЧЁТА ЛОТА В ПРОЦЕНТАХ ОТ ДЕПОЗИТА ПРИ SL КОНЕЦ--------------------------------------------------------------------------------------------+


открытие ордеров я делаю вот таким образом.

//-ЛОГИКА ОТКРЫТИЯ И ЗАКРЫТИЯ  ОРДЕРОВ БЕЗ СТОПА И ПРОФИТА НАЧАЛО--------------------------------------------------------------+

// БАЙ ЛОГИКА

if(f___is_trade_time() && On_or_of_tp_sl== en_off_tp_and_sl ) // ЕСЛИ ВЕРМЯ РАБОЧЕЕ И СТОП, ПРОФИТ ОТКЛ
{

// БАЙ СИГНАЛ
if(f___signal_buy_bot_alerts() && count_orders_buy== 0 && f___is_slippage_ok() )
{
if(count_orders_sell> 0)// ЕСЛИ ЕСТЬ СЕЛЛ ОРДЕРА ЗАКРЫВАЕМ ПРИ БАЙ СИГНАЛЕ
f___close_sell_order(); //ЗАКРЫВАЕМ СЕЛЛ ОРДЕРА

f__open_market_buy(lot, Slippage, sl, tp, Order_comment, Magik_number); // ОТКРЫВАЕМ БАЙ ОРДЕР.
}

// СЕЛЛ СИГНАЛ
if(f___signal_sell_bot_alerts() && count_orders_sell== 0 && f___is_slippage_ok())
{
if(count_orders_buy > 0)// ЕСЛИ ЕСТЬ СЕЛЛ ОРДЕРА ЗАКРЫВАЕМ ПРИ БАЙ СИГНАЛЕ
f___close_buy_order(); //ЗАКРЫВАЕМ БАЙ ОРДЕРА

f__open_market_sell(lot, Slippage, sl, tp, Order_comment, Magik_number); // ОТКРЫВАЕМ СЕЛ ОРДЕР
}
}



//---ЛОГИКА ОТКРЫТИЯ И ЗАКРЫТИЯ  ОРДЕРОВ БЕЗ СТОПА И ПРОФИТА КОНЕЦ--------------------------------------------------------------+

//--ЛОГИКА ОТКРЫТИЯ СО СТОПОМ И ПРОФИТОМ НАЧАЛО-----------------------------------------------------------------------------------------------+
if(On_or_of_tp_sl== en_on_tp_and_sl)// ЕСЛИ СТОП И ПРОФИТ ВКЛЮЧЕНЫ
{
if(f___is_trade_time())// ЕСЛИ ВРЕМЯ РАБОЧЕЕ
{
// --- БАЙ ЛОГИКА 
if(f___is_slippage_ok() && f___signal_buy_bot_alerts() && count_orders_buy== 0)// ЕСЛИ ПРОСКАЛЬЗЫВАНИЕ В НОРМЕ, И ЕСТЬ СИГНАЛ ОТ ИНДИКАТОРА И ОРДЕРОВ БАЙ 0
{
f__open_market_buy(lot, Slippage, sl, tp, Order_comment, Magik_number);
}
//--- СЕЛЛ ЛОГИКА
if(f___is_slippage_ok() && f___signal_sell_bot_alerts() && count_orders_sell== 0)// ЕСЛИ ПРОСКАЛЬЗЫВАНИЕ В НОРМЕ, И ЕСТЬ СИГНАЛ СЕЛЛ ОТ ИНДИКАТОРА И ОРДЕРОВ СЕЛЛ 0
{
f__open_market_buy(lot, Slippage, sl, tp, Order_comment, Magik_number);
}
}
}
//----ЛОГИКА ОТКРЫТИЯ СО СТОПОМ И ПРОФИТОМ КОНЕЦ---------------------------------------------------------------------------------------------+

Принт который в блоке расчёта лота пишет что лот меньше минимального- ставим минимальный лот. И ладно бы если это было при депозите 100 $ и проценете риска в 1-2 процента. А я тест ставлю с депо 10000 и процентом риска 50%. Подскажите пожалуйста почему лот в проценте от депо не считается и как это поправить, чтобы лот начал расчитываться в проценте от депо при стопе?

 
DanilaMactep #:

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

input  double  FixedLot    = 0.01;  // Фиксированный лот
input  double  PersentLot  = 1;     // Процент от депозита, если "0"-отключен
//+------------------------------------------------------------------+
double GetLots()
  {
   double Lot=FixedLot;
   double Balance=AccountBalance();
   double MinLot=MarketInfo(_Symbol,MODE_MINLOT);
   double MaxLot=MarketInfo(_Symbol,MODE_MAXLOT);
   double StepLot=MarketInfo(_Symbol,MODE_LOTSTEP);
   if(PersentLot>0)
      Lot=NormalizeDouble(Balance/100*PersentLot/1000/StepLot,0)*StepLot;
   if(Lot>MaxLot)
      Lot=MaxLot;
   if(Lot<MinLot)
      Lot=MinLot;
   return(Lot);
  }
//+------------------------------------------------------------------+
 
Tretyakov Rostyslav #:
благодарю- завёл это дело :):):)
 
Igor Nagorniuk #:

Помогите разобраться в чём логическая ошибка с буферными массивами индикатора по отдельности всё работает, как объединяю, работает только зигзаг. Всё что отмечено жёлтым, относится к зигзагу.

Вот код:

Всем кто участвовал, в помощи по данному вопросу, спасибо Вам большое.  Всё получилось (как говорится "тяжело в учении, легко в бою") ).


 
Tretyakov Rostyslav #:
Тож спс возьму себе в библиотеку - тоже про лот и процент грамотно надо было.