Maxim Kuznetsov #: я-же не просто так говорю...это проверено
Это проверяли уже давно, примерно лет 8-10 назад, была тема на форуме. Проверка показала ровно это:
Перенесите их в будущее на неделю вперёд, или нарисуйте примерное такие/любые - через неделю получите ровно такую-же картину.
Цена будет ходить между ними, и сигналы к покупке/продаже будут как и сейчас 50/50, то есть - их не будет.
И это при учёте того, что ранее теханализ хоть как-то работал, а сейчас это уже в глубоком прошлом.
Я написал советник на mql5, дипсик переделал его для четвёрки. Немного подправил и всё вроде нормально, вот только не смог найти аналога для OrderCalcMargin().
Суть в том, что маржу нужно посчитать для отложенных ордеров, то есть по той цене на , которой они будут стоять. А в четвёрке ничего подобного не нашёл.
Я написал советник на mql5, дипсик переделал его для четвёрки. Немного подправил и всё вроде нормально, вот только не смог найти аналога для OrderCalcMargin().
Суть в том, что маржу нужно посчитать для отложенных ордеров, то есть по той цене на , которой они будут стоять. А в четвёрке ничего подобного не нашёл.
Вероятнее всего не там искал.
Знатоки, подскажите пожалуйста.
Четвёрка имеет скрытые настройки маржи, к примеру у форекс-дилера из РФ стоит плечо 100 на сервере для клиента, а по факту 30. Делаю сейчас функцию для MT5 с подобным функционалом. Для начала надо определиться есть ли USD в инструменте (базовая валюта и валюта прибыли), если нет, то надо найти валютную пару с USD для базовой валюты. Когда пары известны, то находим стоимость базового актива в USD и переводим в валюту депозита. Всего там 4 варианта расчёта получается.
Aleksey Vyazmikin #: Четвёрка имеет скрытые настройки маржи, к примеру у форекс-дилера из РФ стоит плечо 100 на сервере для клиента, а по факту 30. Делаю сейчас функцию для MT5 с подобным функционалом. Для начала надо определиться есть ли USD в инструменте (базовая валюта и валюта прибыли), если нет, то надо найти валютную пару с USD для базовой валюты. Когда пары известны, то находим стоимость базового актива в USD и переводим в валюту депозита. Всего там 4 варианта расчёта получается.
Понятно. Ну собственно я так и подумал, поэтому, чтоб не изобретать велосипед просто переделал код из учебника под четвёрку.
Я по этим словам искал ничего не нашёл, может теперь поиск их будет находить.
Глянул одним глазом - хорошо проверяли работоспособность? А если нет нужных пар? Я вот под пятёрку пока делал нашёл странности - у меня более размашисто
Демо счёт MQ, валюта депозита USD, плечо 100, лот 1 тип ордера - покупка - на инструменте функция OrderCalcMargin() выдаёт значение 1000, в то время как в спецификации значение 1152,42. Почему маржу выдаёт в евро? А если счёт в рублях, то пытается конвертировать в рубли, но по EURUSD есть ошибка. Вот таблица:
Вот наброски кода
//+------------------------------------------------------------------+//| Test_OrderCalcMargin.mq5 |//| Copyright 2025, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2025, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---string Sym_All=Symbol();//Символdouble Lot=1;//Объёмdouble Price_Open_Buy=1;//Цена открытия покупкиdouble Price_Open_Sell=1;//Цена открытия продажиdouble Price_Open=0;//Цена для передачи в функциюdouble Obyazatelstvo=0;//Размер обязательствdouble Size_kontrakt=0;//Размер контракта (1 лота) в базовой валютеdouble Margin=0;//Маржа по MT5double Plecho=0;//Плечё по MT5ENUM_ORDER_TYPE type=ORDER_TYPE_BUY;//Тип ордераstring Sym_Depo="USDRUBrfd";//Символ для конвертации в депозитstring Depo_Valuta="";//Валюта депозитаstring Base_Valuta="";//Первая валюта в пареstring Get_Sym_Name="";//Дополнительное имя символа для расчёта стоимости контракта (отдельного договора)string Get_Sym_Base="";//Базовая валюта инструментаstring Get_Sym_PV="";//Валюта прибылиlong Baze_One=0;//Базовая (первая) валюта в USD - true или нет falselong Baze_Dop=0;//Базовая (первая) валюта дополнительного символа в USD - true или нет falsebool Use_Obez_Kurs=false;//Использовать кросс-курс для расчёта обязательств в USDdouble arr_Sym_Tick_P[2];//Цена Ask/Bid символа в пунктахdouble arr_Sym_Tick_O[2];//Цена Ask/Bid символа в пунктахdouble arr_Dep_Tick[2];//Цена Ask/Bid валюты депозита - для рубля USD/RUBdouble arr_Calc_Obyazatelstva[2];///Массив для получения результата вычисления оценочного размера обязательстваdouble Calc_margin=0.0;//Расчётное значение маржи
Get_Sym_Base=SymbolInfoString(Sym_All,SYMBOL_CURRENCY_BASE);//Базовая валюта инструмента
Get_Sym_PV=SymbolInfoString(Sym_All,SYMBOL_CURRENCY_PROFIT);//Валюта прибылиif(Get_Sym_Base!="USD" && Get_Sym_PV!="USD")//Нет USD в названии валюты
{
Use_Obez_Kurs=true;
Get_Sym_Name=Get_Cross_Symbol_Base(Sym_All);
Get_Sym_Base=SymbolInfoString(Get_Sym_Name,SYMBOL_CURRENCY_BASE);//Базовая валюта инструментаif(Get_Sym_Base=="USD")//Если первая валюта (Базовая) USD
{
Baze_Dop=1;
}
else
{
Baze_Dop=0;
}
}
else
{
Get_Sym_Name=Sym_All;
Use_Obez_Kurs=false;
if(Get_Sym_Base=="USD")//Если первая валюта (Базовая) USD
{
Baze_One=1;
}
else
{
Baze_One=0;
}
}
Size_kontrakt=SymbolInfoDouble(Sym_All,SYMBOL_TRADE_CONTRACT_SIZE);//Размер торгового контракта
arr_Sym_Tick_P[0]=SymbolInfoDouble(Sym_All,SYMBOL_ASK);//Цена Ask символа в пунктах
arr_Sym_Tick_P[1]=SymbolInfoDouble(Sym_All,SYMBOL_BID);//Цена Bid символа в пунктах
arr_Sym_Tick_O[0]=SymbolInfoDouble(Get_Sym_Name,SYMBOL_ASK);//Цена Ask символа в пунктах
arr_Sym_Tick_O[1]=SymbolInfoDouble(Get_Sym_Name,SYMBOL_BID);//Цена Bid символа в пунктах
arr_Dep_Tick[0]=SymbolInfoDouble(Sym_Depo,SYMBOL_ASK);//Цена Ask валюты депозита - для рубля USD/RUB
arr_Dep_Tick[1]=SymbolInfoDouble(Sym_Depo,SYMBOL_BID);//Цена Bid валюты депозита - для рубля USD/RUB
Depo_Valuta=AccountInfoString(ACCOUNT_CURRENCY);//Валюта депозитаif(Depo_Valuta=="USD")
{
arr_Dep_Tick[0]=1.0;
arr_Dep_Tick[1]=1.0;
}
Plecho=(double)AccountInfoInteger(ACCOUNT_LEVERAGE);//Размер предоставленного плеча//--- объявим переменные, в которые будут записаны коэффициентыdouble initial_margin_rate = 0; // коэффициент взимания начальной маржиdouble maintenance_margin_rate = 0; // коэффициент взимания поддерживающей маржиfor(int i=0;i<2;i++)
{
switch(i)
{
case0:
type=ORDER_TYPE_BUY;
Price_Open=Price_Open_Buy;
Price_Open=arr_Sym_Tick_P[0];
SymbolInfoMarginRate(Sym_All,ORDER_TYPE_BUY,initial_margin_rate,maintenance_margin_rate);
Print("Коэффициенты маржи для Buy, начальная маржа=",initial_margin_rate," поддерживающая маржа=",maintenance_margin_rate);
break;
case1:
type=ORDER_TYPE_SELL;
Price_Open=Price_Open_Sell;
Price_Open=arr_Sym_Tick_P[1];
SymbolInfoMarginRate(Sym_All,ORDER_TYPE_SELL,initial_margin_rate,maintenance_margin_rate);
Print("Коэффициенты маржи для Sell, начальная маржа=",initial_margin_rate," поддерживающая маржа=",maintenance_margin_rate);
break;
}
Calc_Obyazatelstva(
Lot,//Размер лота ордера/позиции
Size_kontrakt,//Размер контракта - стоимость 1 лота в базовой валюте
(int)type,//Тип позиции - Buy/Sell в момент открытия
Baze_One,//Базовая (первая) валюта в USD - true или нет false
Use_Obez_Kurs,//Использовать кросс-курс для расчёта обязательств в USD
Baze_Dop,//Базовая (первая) валюта в USD - true или нет false
arr_Sym_Tick_P,//Цена Ask/Bid символа в пунктах
arr_Sym_Tick_O,//Цена Ask/Bid символа в пунктах
arr_Dep_Tick,//Цена Ask/Bid валюты депозита - для рубля USD/RUB
arr_Calc_Obyazatelstva///Массив для получения результата вычисления оценочного размера обязательства
);
Calc_margin=NormalizeDouble(arr_Calc_Obyazatelstva[1]/Plecho*initial_margin_rate,2);
if(!OrderCalcMargin(type, Sym_All, Lot, Price_Open, Margin))
{
Print("OrderCalcMargin() failed. Error ",GetLastError());
return;
}
else
{
Print("arr_Sym_Tick_P Ask=",arr_Sym_Tick_P[0]," Bid=",arr_Sym_Tick_P[1]);
Print("arr_Sym_Tick_O Ask=",arr_Sym_Tick_O[0]," Bid=",arr_Sym_Tick_O[1]);
Print("arr_Dep_Tick Ask=",arr_Dep_Tick[0]," Bid=",arr_Dep_Tick[1]);
Print(i," Margin=",Margin);
ArrayPrint(arr_Calc_Obyazatelstva);
Print(i," Расчётное значение маржи=", Calc_margin);
Print(i," Разница между фактическим и расчётным значением маржи=", DoubleToString(NormalizeDouble((Margin-Calc_margin),2),2));
}
}
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//|Функция возвращает валютную пару для непрямых с USD котировок - для базовой валюты//+------------------------------------------------------------------+string Get_Cross_Symbol_Base(string inp_Sym)
{
bool found_Sym = false;
int total_Sym = SymbolsTotal(false);
string inp_Base_Sym="";
string Base_Sym="";
string Profit_Sym="";
string name_Sym="start";
inp_Base_Sym=SymbolInfoString(inp_Sym,SYMBOL_CURRENCY_BASE);
for(int i=0; i<total_Sym; i++)
{
//--- получаем имя символа в списке по индексу цикла
name_Sym = SymbolName(i, false);
Base_Sym=SymbolInfoString(name_Sym,SYMBOL_CURRENCY_BASE);//Первая валюта в паре - Базовая валюта
Profit_Sym=SymbolInfoString(name_Sym,SYMBOL_CURRENCY_PROFIT);//Вторая валюта в паре - валюьа прибыли//Print(i," - Имя символа = ",name_Sym);//--- если это искомый символ - распечатаем в журнале его имя и позицию в списке и выйдем из цикла//if(Base_Sym == "USD" && Profit_Sym==inp_Profit_Sym)if((Base_Sym == inp_Base_Sym && Profit_Sym=="USD") || (Base_Sym == "USD" && Profit_Sym==inp_Base_Sym))
{
found_Sym = true;
break;
}
}
return(name_Sym);
}
//+------------------------------------------------------------------+//+---------------------------------------------------------------------------------+//|Функция для расчёта оценчной стоимость обязательства в USD и в валюте депозита |//+-------------------------------------------------------м-------------------------+void Calc_Obyazatelstva(
double Lot_Poz,//Размер лота позицииdouble Size_Konrakt,//Размер торгового контракта (1 лота) в базовой валютеint Type_Poz,//Тип позиции - Buy/Sell в момент открытияlong Baze_USD,//Базовая (первая) валюта в USD - true(1) или нет false(0)bool Use_Obez_Kurs,//Используется дополнительный курс для расчёта обязательст - true(1) или нет false(0)long Baze_USD_0,//Базовая (первая) валюта в USD для расчёта обязательств - true(1) или нет false(0)double &arr_Price_P[],//Цена Ask/Bid символа в пунктахdouble &arr_Price_O[],//Цена Ask/Bid символа для расчёта обязательства в USDdouble &arr_Price_D[],//Цена Ask/Bid валюты депозита - для рубля USD/RUBdouble &arr_Calc_Obyaz_Rez[]//Массив для получения результата вычисления оценочного размера рбязательства
)
{
int Variant=-1;//Вариант применения формулы для расчёта/*
Variant=0;//Для рассчета не используется кросс-курс валюта прибыли USD - базовая валюта не USD
Variant=1;//Для рассчета не используется кросс-курс валюта прибыли не USD - базовая валюта USD
Variant=2;//Для рассчета используется кросс-курс валюта прибыли кросс-курса USD - базовая валюта не USD
Variant=3;//Для рассчета используется кросс-курс валюта прибыли кросс-курса не USD - базовая валюта USD
*/bool Baze_Valuta_USD=false;//Базовая валюта инструмента в USD - true или нет - falsebool Baze_Valuta_Obyaz_USD=false;//Базовая валюта инструмента для расчёта обязательств в USD - true или нет - falsedouble Lot_in_Bazis=0;//Обём похиции (отдельного договора в валюте базового актива)if(Baze_USD==1)Baze_Valuta_USD=true;
if(Baze_USD_0==1)Baze_Valuta_Obyaz_USD=true;
Lot_in_Bazis=Size_Konrakt*Lot_Poz;
if(Use_Obez_Kurs==false)//Для рассчета обязательства в USD не используется другой кросс-курс
{
if(Baze_Valuta_USD==false)//Базовая валюта не USD
{
Variant=0;
}
else//Базовая валюта USD
{
Variant=1;
}
}
else//Для рассчета обязательства в USD используется другой кросс-курс
{
if(Baze_Valuta_Obyaz_USD==false)//Базовая валюта не USD
{
Variant=2;
}
else//Базовая валюта USD
{
Variant=3;
}
}
switch(Type_Poz)
{
case0:
switch(Variant)//Buy
{
case0://Не используется дополнительный курс для расчёта обязательств - базовая валюта не USD
arr_Calc_Obyaz_Rez[0]=arr_Price_P[0]*Lot_in_Bazis;
arr_Calc_Obyaz_Rez[1]=arr_Price_P[0]*Lot_in_Bazis*arr_Price_D[0];
break;
case1://Не используется дополнительный курс для расчёта обязательств - базовая валюта USD - ok.
arr_Calc_Obyaz_Rez[0]=Lot_in_Bazis;
arr_Calc_Obyaz_Rez[1]=Lot_in_Bazis*(arr_Price_D[0]);
break;
case2://используется дополнительный курс для расчёта обязательств - базовая валюта не USD - ok.
arr_Calc_Obyaz_Rez[0]=arr_Price_O[0]*Lot_in_Bazis;
arr_Calc_Obyaz_Rez[1]=arr_Price_O[0]*Lot_in_Bazis*arr_Price_D[0];
break;
case3://используется дополнительный курс для расчёта обязательств - базовая валюта USD
arr_Calc_Obyaz_Rez[0]=1.0/arr_Price_O[1]*Lot_in_Bazis;
arr_Calc_Obyaz_Rez[1]=1.0/arr_Price_O[1]*Lot_in_Bazis*arr_Price_D[0];
break;
}
break;
case1:
switch(Variant)//Sell
{
case0://Не используется дополнительный курс для расчёта обязательств - базовая валюта не USD
arr_Calc_Obyaz_Rez[0]=arr_Price_P[1]*Lot_in_Bazis;
arr_Calc_Obyaz_Rez[1]=arr_Price_P[1]*Lot_in_Bazis*arr_Price_D[1];
break;
case1://Не используется дополнительный курс для расчёта обязательств - базовая валюта USD - ok.
arr_Calc_Obyaz_Rez[0]=Lot_in_Bazis;
arr_Calc_Obyaz_Rez[1]=Lot_in_Bazis*(arr_Price_D[1]);
break;
case2://используется дополнительный курс для расчёта обязательств - базовая валюта не USD - ok.
arr_Calc_Obyaz_Rez[0]=arr_Price_O[1]*Lot_in_Bazis;
arr_Calc_Obyaz_Rez[1]=arr_Price_O[1]*Lot_in_Bazis*arr_Price_D[1];
break;
case3://используется дополнительный курс для расчёта обязательств - базовая валюта USD
arr_Calc_Obyaz_Rez[0]=1.0/arr_Price_O[0]*Lot_in_Bazis;
arr_Calc_Obyaz_Rez[1]=1.0/arr_Price_O[0]*Lot_in_Bazis*arr_Price_D[1];
break;
}
break;
}
}
//+------------------------------------------------------------------+
Нет не хорошо. Сейчас проверил, кросы не считает. Файл из книги MarginProfitMeter.mqh с которого я списывал, тоже кросы не считает, да ещё и запятые в марже не верно ставит.
Проверяли? Работает? Хоть на каком то инструменте выдаёт правильный результат?
Судя по коду, на все три вопроса ответ - нет.
У меня ни терминала MT4 ни когда не было, ни знаний этого языка. Просто попросил, чтобы "умный" интеллект показал свои способности. Судя по Вашей реакции - результата нет. )) Просто лишний раз убедился в его "способностях".
я-же не просто так говорю...это проверено
Это проверяли уже давно, примерно лет 8-10 назад, была тема на форуме. Проверка показала ровно это:
И это при учёте того, что ранее теханализ хоть как-то работал, а сейчас это уже в глубоком прошлом.Это проверяли уже давно, примерно лет 8-10 назад, была тема на форуме. Проверка показала ровно это:
И это при учёте того, что ранее теханализ хоть как-то работал, а сейчас это уже в глубоком прошлом.вы просто не умеете готовить кошек :-)
Возникла необходимость написать советник для МТ4.
Я написал советник на mql5, дипсик переделал его для четвёрки. Немного подправил и всё вроде нормально, вот только не смог найти аналога для OrderCalcMargin().
Суть в том, что маржу нужно посчитать для отложенных ордеров, то есть по той цене на , которой они будут стоять. А в четвёрке ничего подобного не нашёл.
Вероятнее всего не там искал.
Знатоки, подскажите пожалуйста.
Возникла необходимость написать советник для МТ4.
Я написал советник на mql5, дипсик переделал его для четвёрки. Немного подправил и всё вроде нормально, вот только не смог найти аналога для OrderCalcMargin().
Суть в том, что маржу нужно посчитать для отложенных ордеров, то есть по той цене на , которой они будут стоять. А в четвёрке ничего подобного не нашёл.
Вероятнее всего не там искал.
Знатоки, подскажите пожалуйста.
Делаю сейчас функцию для MT5 с подобным функционалом.
Для начала надо определиться есть ли USD в инструменте (базовая валюта и валюта прибыли), если нет, то надо найти валютную пару с USD для базовой валюты. Когда пары известны, то находим стоимость базового актива в USD и переводим в валюту депозита.
Всего там 4 варианта расчёта получается.
Четвёрка имеет скрытые настройки маржи, к примеру у форекс-дилера из РФ стоит плечо 100 на сервере для клиента, а по факту 30.
Делаю сейчас функцию для MT5 с подобным функционалом.
Для начала надо определиться есть ли USD в инструменте (базовая валюта и валюта прибыли), если нет, то надо найти валютную пару с USD для базовой валюты. Когда пары известны, то находим стоимость базового актива в USD и переводим в валюту депозита.
Всего там 4 варианта расчёта получается.
Понятно. Ну собственно я так и подумал, поэтому, чтоб не изобретать велосипед просто переделал код из учебника под четвёрку.
Слова для поиска.
Маржа мт4, маржа MQL4, расчёт маржи мт4, OrderCalcMargin MQL4.
Я по этим словам искал ничего не нашёл, может теперь поиск их будет находить.
Понятно. Ну собственно я так и подумал, поэтому, чтоб не изобретать велосипед просто переделал код из учебника под четвёрку.
Слова для поиска.
Маржа мт4, маржа MQL4, расчёт маржи мт4, OrderCalcMargin MQL4.
Я по этим словам искал ничего не нашёл, может теперь поиск их будет находить.
Глянул одним глазом - хорошо проверяли работоспособность?
А если нет нужных пар?
Я вот под пятёрку пока делал нашёл странности - у меня более размашисто
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
Aleksey Vyazmikin, 2026.06.06 03:37
Демо счёт MQ, валюта депозита USD, плечо 100, лот 1 тип ордера - покупка - на инструменте функция OrderCalcMargin() выдаёт значение 1000, в то время как в спецификации значение 1152,42.

Почему маржу выдаёт в евро? А если счёт в рублях, то пытается конвертировать в рубли, но по EURUSD есть ошибка.
Вот таблица:
Вот наброски кода
хорошо проверяли работоспособность?
Нет не хорошо. Сейчас проверил, кросы не считает. Файл из книги MarginProfitMeter.mqh с которого я списывал, тоже кросы не считает, да ещё и запятые в марже не верно ставит.
А если нет нужных пар?
Сейчас добавил SymbolSelect(нужный символ, true) и Sleep(500) после него, если не смогли найти нужный символ.
Нет не хорошо. Сейчас проверил, кросы не считает.
Здравствуйте, Александр! Вот такой вариант предложил "умный" интеллект от Гугла:
С уважением, Владимир.Проверяли? Работает? Хоть на каком то инструменте выдаёт правильный результат?
Судя по коду, на все три вопроса ответ - нет.
Проверяли? Работает? Хоть на каком то инструменте выдаёт правильный результат?
Судя по коду, на все три вопроса ответ - нет.
У меня ни терминала MT4 ни когда не было, ни знаний этого языка. Просто попросил, чтобы "умный" интеллект показал свои способности. Судя по Вашей реакции - результата нет. )) Просто лишний раз убедился в его "способностях".
С уважением, Владимир.