Вопрос к программистам.

 
Добрый день!  Пытаюсь сделать всё как написано здесь



библиотеку скачал и поместил в необходимую папку
в советнике прописал
#import "MM_MartingaleComplex.ex4"

   double MM_MartingaleComplex(double dCoeff,double dBasicLot,string sSymbol,bool bIf2TradeWithLittleMoney);   

дальше в коде советника вставил
 MM_MartingaleComplex (2,0.1,Symbol(),True);
         
         if (GlobalVariableGet ("мartingaleComplex_lot ")>0)
затем у меня идёт такая строчка
l_ticket_56 = OrderSend(Symbol(), l_cmd_60, lot_size, NormalizeDouble(a_price_16, Digits), 3, 0, 0, a_comment_40, a_magic_48, a_datetime_52, Blue);
я думал что вместо  lot_size нужно вставить  GlobalVariableGet ("мartingaleComplex_lot ") но ничего не получилось, т.е. сделки вообще не открываются
что я делю не так?
 
советник-пример
Файлы:
 
А почему бы Вам ни написать свою функцию управления лотами по принципу Мартингейла? Зачем использовать чью-то библиотеку, да ещё и без исходного кода, как будто удвоение убытка - это секрет-секретов?
 
причина простая- не знаю языка программирования, есть общие понятия чтобы попытаться хоть таким способом решить задачу
 
Пользовательские подпрограммы можно условно разбить на два класса - те которые просто выполняют какой-то код и ни чего не возвращают в вызвавшую их основную программу - это так называемые процедуры и 2) функции - подпрограммы, которые что-то возвращают в основную программу.
Судя по Вашему описанию, подпрограмма 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 (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 дарствую. совершенно бесплатно. заодно ознакомитесь с принципами авто-торговли, ну, и с некоторыми другими принципами.
 
Владимир и Андрей, большое спасибо за помощь.
Причина обращения: