Всем добрый день. Пытаюсь написать очередной Грааль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); // ШАГ ИЗМЕНЕНИЯ РАЗМЕРА ЛОТА//----ПЕРЕМЕННЫЕ ДЛЯ РАСЧЁТА ЛОТА КОНЕЦ---------------------------------------------------------------------------------------------+
Далее идёт он тик с определением новой свечи, получение ордеров бай и селл.
voidOnTick()
{ 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;
}
elseif(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);// // Проверка на нули — защита от деления на 0if (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%. Подскажите пожалуйста почему лот в проценте от депо не считается и как это поправить, чтобы лот начал расчитываться в проценте от депо при стопе?
Помогите разобраться в чём логическая ошибка с буферными массивами индикатора по отдельности всё работает, как объединяю, работает только зигзаг. Всё что отмечено жёлтым, относится к зигзагу.
Вот код:
Всем кто участвовал, в помощи по данному вопросу, спасибо Вам большое. Всё получилось (как говорится "тяжело в учении, легко в бою") ).
Вот этот код, хорошо тем, что его можно оптимизировать в тестере, в отличии от тех в которых время задаётся стринговой переменной.
о! Спасибо вам большое! тоже взял к себе в копилку и в работу (тоже оптить потом надо будет для краткосрока.....)
Не знал, что существует такое время.
[edit]
23 часа разницы между 00:00 и 24:00. Похоже, оно работает не совсем так, как вы ожидаете
Вы правы, так корректнее будет
Есть матрица, допустим, размером 4х4.
Как получить значение из строки 2, колонки 2 ? (отчёт с нуля)
Для двумерного массива array[4][4] это будет просто: value=array[2][2];
А как это сделать для матрицы?
Есть матрица, допустим, размером 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
А в чём подвох? Вроде бы также.
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. Мне нужно рассчитать лот так чтобы если в настройках я отключил стоп и профит ордера открывались без стопа и профита. А если включил то стоп и профит ставятся в пунктах, а лот рассчитывается в проценте от депозита. Пробую сделать так. Выше он тика у меня объявлены все переменные которые понадобиться для расчёта лота вот так.
Далее идёт он тик с определением новой свечи, получение ордеров бай и селл.
Ниже идёт блок кода при отключении стопа и профита.
После этого идёт код расчёта лота при включенном стопе и профите- стоп и профит расчитывается в пунктах, а лот считается в проценте от депозита с помощью 2 функций вот таким макаром
открытие ордеров я делаю вот таким образом.
Принт который в блоке расчёта лота пишет что лот меньше минимального- ставим минимальный лот. И ладно бы если это было при депозите 100 $ и проценете риска в 1-2 процента. А я тест ставлю с депо 10000 и процентом риска 50%. Подскажите пожалуйста почему лот в проценте от депо не считается и как это поправить, чтобы лот начал расчитываться в проценте от депо при стопе?
Всем добрый день.
Помогите разобраться в чём логическая ошибка с буферными массивами индикатора по отдельности всё работает, как объединяю, работает только зигзаг. Всё что отмечено жёлтым, относится к зигзагу.
Вот код:
Всем кто участвовал, в помощи по данному вопросу, спасибо Вам большое. Всё получилось (как говорится "тяжело в учении, легко в бою") ).