А почему бы Вам ни написать свою функцию управления лотами по принципу Мартингейла? Зачем использовать чью-то библиотеку, да ещё и без исходного кода, как будто удвоение убытка - это секрет-секретов?
причина простая- не знаю языка программирования, есть общие понятия чтобы попытаться хоть таким способом решить задачу
Пользовательские подпрограммы можно условно разбить на два класса - те которые просто выполняют какой-то код и ни чего не возвращают в вызвавшую их основную программу - это так называемые процедуры и 2) функции - подпрограммы, которые что-то возвращают в основную программу.
Судя по Вашему описанию, подпрограмма double MM_MartingaleComplex(...) - это функция, которая возвращает лот будущего ордера.
Судя по Вашему описанию, подпрограмма double MM_MartingaleComplex(...) - это функция, которая возвращает лот будущего ордера.
В этом случае её нужно вызывать перед использованием функции OrderSend(). Например, вот так:
double RealLot; // просчитываем лот будущего ордера RealLot=MM_MartingaleComplex(/*коэффициент*/,/*базовый лот*/,/*имя валютной пары*/,/*положение выключателя на случай нехватки денег*/);После указания всех нужных Вам в этой функции параметров, в переменной RealLot должен оказаться лот будущего ордера. Вот его-то и нужно вставлять в функцию OrderSend(). НО! В той же библиотеке сказано, что есть параметр, запрещающий/разрешающий торги при нехватке депозита. Так что скорее всего при запрещающем режиме в переменной RealLot окажется лот, который менее допустимого. Вот это нужно проверить.
double MinLot=MarketInfo(Symbol(),MODE_MINLOT); if(RealLot<MinLot){// если лот будущего ордера менее минимально-допустимого, то стоп торговля return(0) ;} else{// иначе лот нормальный и можно открывать позу int Ticket=OrderSend(/*сюда вписываем параметры функции, задействуя для указания лота переменную RealLot*/); }
вот что пишет автор этой функции
// Функция MM_MartingaleComplex() помещает расчитанное значение (лот) в глобальную переменную с именем мartingaleComplex_lot.
// Чтобы считать её значение, необходимо воспользоваться функцией GlobalVariableGet().
// Целесообразно пытаться отослать ордер только если ММ позволяет открыть по крайней мере минимальный лот
// (больший 0)
//if (GlobalVariableGet("fxprcnt_lot")>0)
то же самое говорите и вы, и что я собственно и делал
// Функция MM_MartingaleComplex() помещает расчитанное значение (лот) в глобальную переменную с именем мartingaleComplex_lot.
// Чтобы считать её значение, необходимо воспользоваться функцией GlobalVariableGet().
// Целесообразно пытаться отослать ордер только если ММ позволяет открыть по крайней мере минимальный лот
// (больший 0)
//if (GlobalVariableGet("fxprcnt_lot")>0)
то же самое говорите и вы, и что я собственно и делал
MM_MartingaleComplex (2,1,Symbol(),True); if (GlobalVariableGet ("мartingaleComplex_lot ")>0) l_ticket_56 = OrderSend(Symbol(), l_cmd_60,GlobalVariableGet ("мartingaleComplex_lot ") , NormalizeDouble(a_price_16, Digits), 3, 0, 0, a_comment_40, a_magic_48, a_datetime_52, Blue);но это результатов не дало, вот я и спрашивал в чём моя ошибка?
может быть нужно удалить всё что связано с первоначальным расчётом размера позиции?
Вот набросал Вам код. Попробуйте разобраться самостоятельно - тут не сложно - я всего лишь показал как работать с мартингейлом в функции управления лотмаи.
Всё, что Вам нужно сделать - это догадаться, как произвести проверку на предмет наличия достаточных средств.
Всё, что Вам нужно сделать - это догадаться, как произвести проверку на предмет наличия достаточных средств.
extern double StartLot=0.1;// стартовый лот ордера (он же при удачной сделке) extern double KoefLota=2;// коэффициент, на который умножается лот убыточного ордера extern int MAGIC=12345321;// у ордеров, открытых вручную, магик = нулю string SMB; double MinLots,MaxLots,LOT; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init(){ SMB=Symbol(); MinLots=(MarketInfo(SMB,MODE_MINLOT)); MaxLots=MarketInfo(SMB,MODE_MAXLOT); return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit(){ return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start(){ LOT=Flot(); Ticket=OrderSend(/*сюда пишем параметры функции*/); return(0); } //+------------------------------------------------------------------+ // ----------------------- double Flot() ----------------------------- // функция возвращает лот очередного ордера // ---------------------------------------- double Flot(){ double=RealLot,OldLot; /* первое, что нужно сделать - это определиться, была ли последняя сделка убыточна. Если была, то её лот умножаем на коэффициент. В противном случае открываем ордер с лотом, указанным в переменной StartLot */ OldLot=FOldLot(); if(OldLot<=0){// последний ордер в профите - используем StartLot RealLot=StartLot; } else{// иначе ордер был в убытке - умножаем его лот на коэффициент RealLot=OldLot*KoefLota; RealLot=ProverkaLota(RealLot); } return(RealLot); } // -------------- FOldLot() ----------------------------------------- //функция возвращает лот последнего ордера если ордер принёс убыток // и величнину менее или равную нулю, если он принёс прибыль // --------------------------------------------------------- double FOldLot(){ double ProfitOrdera,LotOrdera; datetime TimeZakrOrdera=0; for(int i=OrdersHistoryTotal()-1;i>=0;i++){ if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){ Print("Ошибка № ",GetLastError()," при выборе ордера № ",i); } else{ if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} if(OrderType()==OP_BUY || OrderType()==OP_SELL){ if(OrderCloseTime()>TimeZakrOrdera){ TimeZakrOrdera=OrderCloseTime(); ProfitOrdera=OrderProfit(); LotOrdera=OrderLots(); } } } } /* после прохождения цикла в переменных лежит профит и лот последнего ордера */ if(ProfitOrdera<0){// профит отрицательный - возвращаем лот ордера для его дальнейшего удвоения return(LotOrdera); } else{ return(-1);// ордер в профите - возвращаем отрицательное значение } } // ============ ProverkaLota() ===================================================================== // функция принимает и нормализует лот ордера //----------------------------------------------------- double ProverkaLota(double LotOrdera){ double CorrectLot=0; int diglots=0,PozTochki=0; switch(MinLots){ case 0.001: diglots=3; break; case 0.01: diglots=2; break; case 0.1: diglots=1; break; case 1: diglots=0; break; default: CorrectLot=0; } Temp=DoubleToStr(LotOrdera,7); // отбрасываем лишние числа if(diglots==0){ CorrectLot=StrToDouble(Temp); CorrectLot=MathFloor(CorrectLot); } else{ PozTochki=StringFind(Temp,".",0); for(int i=0;i<=PozTochki+diglots;i++){ Temp1=Temp1+StringSubstr(Temp,i,1); } CorrectLot=StrToDouble(Temp1); } if(CorrectLot<MinLots){ CorrectLot=MinLots; } if(CorrectLot>MaxLots){ CorrectLot=MaxLots; } //Alert("Откорректировано до = ",CorrectLot); return(CorrectLot); } // =================================================================================================
Возьмите JQS Terminator Line и юзайте на здоровье, возьмите оттуда всё, что нужно.
Прибыль/убыток строго в соответствии коэффициента умножения, к тому же прибыль/убыток не зависят от TP /SL
PS дарствую. совершенно бесплатно. заодно ознакомитесь с принципами авто-торговли, ну, и с некоторыми другими принципами.
Прибыль/убыток строго в соответствии коэффициента умножения, к тому же прибыль/убыток не зависят от TP /SL
PS дарствую. совершенно бесплатно. заодно ознакомитесь с принципами авто-торговли, ну, и с некоторыми другими принципами.
Владимир и Андрей, большое спасибо за помощь.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
библиотеку скачал и поместил в необходимую папку
в советнике прописал
дальше в коде советника вставил затем у меня идёт такая строчка
я думал что вместо lot_size нужно вставить GlobalVariableGet ("мartingaleComplex_lot ") но ничего не получилось, т.е. сделки вообще не открываются
что я делю не так?