double mgnSymb,LOT
if(OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1,SymbolInfoDouble(Symbol(),SYMBOL_BID),mgnSymb)LOT=AccountInfoDouble(ACCOUNT_BALANCE)/mgnSymb;
double mgnSymb,LOT
if(OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1,SymbolInfoDouble(Symbol(),SYMBOL_BID),mgnSymb)LOT=AccountInfoDouble(ACCOUNT_BALANCE)/mgnSymb;
а разве полученное таким образом "mgnSymb" не будет являться ГО контракта?
а разве полученное таким образом "mgnSymb" не будет являться ГО контракта?
пожалуйста проверьте работу кода самостоятельно
Так вот я и проверяю. Получается, что он просто возвращает то, что в МТ5 называется маржой, а на бирже - ГО. Ну т.е. результат деления депозита на эту самую маржу. Но вопрос-то был в другом. Как получить кол-во без плеч. Есть ли вообще в МТ обычная "волшебная" кнопка в настройках тестера или советника - работать на такой-то процент от депо? В том же АмиБрокере такое было. Тут... поле "плечи" возле поля "начальный" депозит ни на что не влияет. Да и цифры там непонятные. К бирже отношения не имеющие. Также отчего-то постоянно скидывается настройка "освобождать накопленную прибыль в конце дня".
а это, разве не то?
//+------------------------------------------------------------------+ //| TradeSizeOptimized.mq5 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #define MA_MAGIC 1234502 //--- input double MaximumRisk = 0.02; // Maximum Risk in percentage input double DecreaseFactor = 3; // Descrease factor //--- string txt; //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double TradeSizeOptimized(void) { double price=0.0; double margin=0.0; //--- select lot size if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price)) return(0.0); if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin)) return(0.0); if(margin<=0.0) return(0.0); double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2); //--- calculate number of losses orders without a break if(DecreaseFactor>0) { //--- select history for access HistorySelect(0,TimeCurrent()); //--- int orders=HistoryDealsTotal(); // total history deals int losses=0; // number of losses orders without a break for(int i=orders-1;i>=0;i--) { ulong ticket=HistoryDealGetTicket(i); if(ticket==0) { Print("HistoryDealGetTicket failed, no trade history"); break; } //--- check symbol if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol) continue; //--- check Expert Magic number if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=MA_MAGIC) continue; //--- check profit double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); if(profit>0.0) break; if(profit<0.0) losses++; } //--- if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); } //--- normalize and check limits double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP); lot=stepvol*NormalizeDouble(lot/stepvol,0); double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); if(lot<minvol) lot=minvol; double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX); if(lot>maxvol) lot=maxvol; //--- return trading volume return(lot); } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- StringConcatenate(txt,"Средства=",DoubleToString(TradeSizeOptimized(),2)); DrawLABEL(3,"cm 6",txt,5,25,clrLime,ANCHOR_RIGHT); } //+------------------------------------------------------------------+ //| DrawLABEL | //+------------------------------------------------------------------+ void DrawLABEL(int c,string name,string text,int X,int Y,color clr,int ANCHOR=ANCHOR_LEFT,int FONTSIZE=8) { if(ObjectFind(0,name)==-1) { ObjectCreate(0,name,OBJ_LABEL,0,0,0); ObjectSetInteger(0,name,OBJPROP_CORNER,c); ObjectSetInteger(0,name,OBJPROP_XDISTANCE,X); ObjectSetInteger(0,name,OBJPROP_YDISTANCE,Y); ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false); ObjectSetInteger(0,name,OBJPROP_SELECTED,false); ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FONTSIZE); ObjectSetString(0,name,OBJPROP_FONT,"Arial"); ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR); } ObjectSetString(0,name,OBJPROP_TEXT,text); ObjectSetInteger(0,name,OBJPROP_COLOR,clr); } //+------------------------------------------------------------------+
--------------------------------------
вот - например у Вас 100 000 , рассчитывает с каким лотом откроется = 1.32
Так вот я и проверяю. Получается, что он просто возвращает то, что в МТ5 называется маржой, а на бирже - ГО. Ну т.е. результат деления депозита на эту самую маржу. Но вопрос-то был в другом. Как получить кол-во без плеч. Есть ли вообще в МТ обычная "волшебная" кнопка в настройках тестера или советника - работать на такой-то процент от депо? В том же АмиБрокере такое было. Тут... поле "плечи" возле поля "начальный" депозит ни на что не влияет. Да и цифры там непонятные. К бирже отношения не имеющие. Также отчего-то постоянно скидывается настройка "освобождать накопленную прибыль в конце дня".
умножьте маржу за 1 лот на плечо и поделите на (100*баланс)
делов то
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
МТ5 используется для работы на срочном рынке Московской биржи.
В настоящее время делаем советник для тестирования и возможной дальнейшей работы в качестве робота.
Не могу понять, как заставить советник в автоматическом режиме считать кол-во лотов.
Распишу понятнее, что имею в виду.
Допустим у нас депозит - 1 000 000 руб. Стоимость 1 лота BR - 35 502 руб. (это полная стоимость. Не ГО!). Таким образом чтобы нагрузить депо на 100% мне надо купить 28 лотов (1 000 000 / 35502). Т.е. я под 100% загрузкой подразумеваю именно чистую загрузку в расчете от реальной стоимости. Не по ГО. Учитывая же ГО максимально возможная загрузка составляет 134 лота.
Так вот, могу ли я в настройках тестера указать, чтобы он использовал 100% загрузку? Если да, то как? И как сделать, если я хочу, к примеру, разбить входы - делать набор позиции: первый вход на 33%, второй на 33% и третий на 33%.