← К каталогу
Исходный код · ID 1568

e04lc07-v4.mq5

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

E04LC07-v4 — торговый советник для MetaTrader 5, реализующий систему ставок по принципу Даламбера: размер позиции уменьшается после выигрыша и увеличивается после проигрыша. Советник работает с несколькими валютными парами, отслеживает текущую экспозицию по каждой валюте и управляет открытием, увеличением и частичным закрытием позиций.

Советник обрабатывает событие OnTick, проверяет допустимость торговли, ограничения по марже и дате риска, а также отправляет торговые запросы через OrderSend. Включает модификацию TakeProfit у наиболее прибыльных позиций и автоматическое уменьшение убыточных позиций при превышении допустимого риска.

Внутри отслеживаются экстремальные показатели: максимальная экспозиция, наибольший убыток и максимальная прибыль по открытым позициям. Данные используются для принятия решений об открытии новых позиций или корректировке существующих в рамках заданных пользователем лимитов.

Настройки программы

НастройкаОписание
WARNING Предупреждение: не все входные параметры проверены на корректность
Do NOT take risk after this date ! (COMPETITION) (LastRiskDate) Дата и время, после которых нельзя принимать риск (ограничение для соревнования)
Don't increase risk below this MARGIN_LEVEL ! (MinMargin) Минимальный уровень маржи, ниже которого нельзя увеличивать риск
TakeProfit as part of price ( 0.01=1.0% ) same to all Symbol (KTP) TakeProfit как доля цены (0.01 = 1.0%), одинаковая для всех символов
Maximal Position_volume per Symbol (Limit_Position_Lot) Максимальный объём позиции для каждого символа
Maximal Exposure per Value ( total from all symbols ) (Limit_Exposure_Lot) Максимальная экспозиция на значение (суммарно по всем символам)
Maximal Exposure at send +/-(Valu1-Valu2) = Accepted Risk (LotAtRisk) Максимальная экспозиция при отправке ордера — принятый риск при разнице значений
Time betwen two executions (seconds) = accelerate tests (NoWorkTime) Время между двумя выполнениями (в секундах), используется для ускорения тестирования
Multiply minimal lot volume. Work only if 0.01 (LotMX) Множитель минимального объёма лота, работает только если минимальный объём меньше 0.1
Получить полный код

Поиск по коду файла

#property version   "111.008"
#property description "D'Alembert betting system :"
#property description "The stake should be decreasing after the winning bet,"
#property description "... and increasing after the loosing one."

input string   WARNING="NOT all Input is check to be correct !";
input datetime LastRiskDate=D'2011.12.17 23:59:59'; // Do NOT take risk after this date ! (COMPETITION)
input double   MinMargin=200.1;                     // Don't increase risk below this MARGIN_LEVEL !
input double   KTP=0.0095;                          // TakeProfit as part of price ( 0.01=1.0% ) same to all Symbol
input double   Limit_Position_Lot=2.5;              // Maximal Position_volume per Symbol
input double   Limit_Exposure_Lot=0.55;             // Maximal Exposure per Value ( total from all symbols )
input double   LotAtRisk=0.75;                      // Maximal Exposure at send +/-(Valu1-Valu2) = Accepted Risk
input int      NoWorkTime=0;                        // Time betwen two executions (seconds) = accelerate tests
input int      LotMX=10;                            // Multiply minimal lot volume. Work only if 0.01

enum SymbolPosition {PNon,PBuy,PSell}; // This is a enum TYPE declaration !
/*

const int Nmax = 10; // Used Symbol (valu-pair) ; max=10
const int Vmax=5; // index of last used Value +1 , first index=0 !
double V[5]; // Value exposure ; 0=EUR,1=USD,2=JPY,3=CHF,4=GBP,5=CAD ... no other for now.
string S[10] = {"EURUSD","USDJPY","EURJPY","GBPJPY","GBPCHF","EURCHF","GBPUSD","EURGBP","USDCHF","CHFJPY"};
SymbolPosition A[10] = {PSell,PSell,PBuy,PBuy,PSell,PSell,PBuy,PBuy,PBuy,PSell}; // What is action for each symbol
SymbolPosition SPos[10]; // What is position for each symbol
*/

const int Vmax=7; // index of last used Value +1 , first index=0 !
double V[7]; // Value exposure ; 0=EUR,1=USD,2=JPY,3=CHF,4=GBP,5=CAD,6=AUD.

const int Nmax=3; // Used Symbol (valu-pair) ;
string S[3]={"EURUSD","EURGBP","GBPUSD"};
SymbolPosition A[3]={PBuy,PSell,PSell}; // What is action for each symbol
SymbolPosition SPos[3];                 // What is position for each symbol
double LotV;              // Sum all lots : EXPOSURE
double LotP;              // Sum all lots : POSITION
string Val1,Val2;         // Current Symbol ( valu-pair == Val1/Val2 )
datetime LastMessageTime; // When Last Message was print
int I,J;                  // main index
uchar SDig;               // Current symbol digits
string Out;               // Text on the screen
MqlTick T;                // Tick value
MqlTradeRequest R;        // Request - order
MqlTradeResult D;         // Deal = result of Request
double LotMin;            // Server setting
double NLots;             // Current symbol : Position volume
double Take;              // TakeProfit for open position (price).
double TP;                // TakeProfit for each order (delta_price)
double SStop;             // Market stop for current Symbol
datetime LastWorkTime;    // Used to accelerate tests , with "NoWorkTime"
double BestBallance;      // Used to protect from too much close with loss
bool   CloseOne;          // Used to stop manual close after firt one
double LotAtSend;         // varible : Same as "LotAtRisk"
string Reason;            // Why make Close_With_Loss
double FreeBalance;       // Available money for correction
double TPMove;

string MaxExpSym;         // Symbol with maximal position ( 1-"worst" position )
double MaxExpPos;         // Volume of maximal existing position
string MaxLosSym;         // Symbol with maximal loss ( 2-"worst" position )
double MaxLosPos;         // Profit(Loss) of most loosing position.
string MaxProSym;         // Symbol with maximal profit
double MaxProPos;         // Value of maximal profit

void PrintNM(int NMTLimit,string NMS) // Print NMS with minimum interval NMTLimit seconds
  {
   if(LastMessageTime+NMTLimit<TimeCurrent())
     { LastMessageTime=TimeCurrent(); Print(NMS); }
  }

int ValueToIndex(string SIndex) // in=Value_string; out=Index_of_Value;
  {
   if( SIndex=="EUR" ) return(0);
   if( SIndex=="USD" ) return(1);
   if( SIndex=="JPY" ) return(2);
   if( SIndex=="CHF" ) return(3);
   if( SIndex=="GBP" ) return(4);
   if( SIndex=="CAD" ) return(5);
   if( SIndex=="AUD" ) return(6);
   return(-1);
  }

string IndexToValue(int VIndex) // in=Index_of_Value; out=Value_string;
  {
   if( VIndex==0 ) return("EUR");
   if( VIndex==1 ) return("USD");
   if( VIndex==2 ) return("JPY");
   if( VIndex==3 ) return("CHF");
   if( VIndex==4 ) return("GBP");
   if( VIndex==5 ) return("CAD");
   if( VIndex==6 ) return("AUD");
   return("ANY");
  }

void Exposure() // result is : V[] , LotV , LotP, MaxExpSym - global
  {
   int EI,EJ; // index - local
   double ELotP; // Position_Lot for current symbol in base EUR - local
   for(EI=0;EI<Vmax;EI++) V[EI]=0.0; LotP=0.0;
   for(EI=0;EI<PositionsTotal();EI++)
     {
      Val1=StringSubstr(PositionGetSymbol(EI),0,3); Val2=StringSubstr(PositionGetSymbol(EI),3,3); // here position is selected !!!
      EJ=ValueToIndex(Val1);
      switch(PositionGetInteger(POSITION_TYPE))
        {
         case POSITION_TYPE_BUY :
           {
            if(Val1=="EUR") ELotP=PositionGetDouble(POSITION_VOLUME);
            else            ELotP=PositionGetDouble(POSITION_VOLUME)/SymbolInfoDouble("EUR"+Val1,SYMBOL_ASK);
            V[EJ]=V[EJ]+ELotP;
            LotP=LotP+ELotP;
            break; 
           }
         case POSITION_TYPE_SELL :
           {
            if(Val1=="EUR") ELotP=PositionGetDouble(POSITION_VOLUME);
            else            ELotP=PositionGetDouble(POSITION_VOLUME)/SymbolInfoDouble("EUR"+Val1,SYMBOL_ASK);
            V[EJ]=V[EJ]-ELotP; 
            LotP=LotP+ELotP; 
            break; 
           }
        } // end : swich Val1
      EJ=ValueToIndex(Val2);
      switch(PositionGetInteger(POSITION_TYPE))
        {
         case POSITION_TYPE_SELL :
           {
            if(Val1=="EUR") ELotP=PositionGetDouble(POSITION_VOLUME);
            else            ELotP=PositionGetDouble(POSITION_VOLUME)/SymbolInfoDouble("EUR"+Val1,SYMBOL_ASK);
            V[EJ]=V[EJ]+ELotP; 
            LotP=LotP+ELotP;
            break; 
           }
         case POSITION_TYPE_BUY :
           {
            if(Val1=="EUR") ELotP=PositionGetDouble(POSITION_VOLUME);
            else            ELotP=PositionGetDouble(POSITION_VOLUME)/SymbolInfoDouble("EUR"+Val1,SYMBOL_ASK);
            V[EJ]=V[EJ]-ELotP; 
            LotP=LotP+ELotP; 
           }
        } // end : swich Val2
     } // end : for all symbol
   LotP=LotP/2.0;
   LotV=0.0; for(EI=0;EI<Vmax;EI++) LotV=LotV+MathAbs(V[EI]);
  }

void Extreme()
  {
   int EI;
   MaxExpPos=0.0; MaxLosPos=0.0; MaxProPos=0.0;
   for(EI=0;EI<PositionsTotal();EI++)
     {
      PositionGetSymbol(EI);
      if(MaxExpPos<PositionGetDouble(POSITION_VOLUME))          // Maximal Position Volume and Symbol
        { MaxExpPos=PositionGetDouble(POSITION_VOLUME); MaxExpSym=PositionGetSymbol(EI); }
      if(MaxLosPos>PositionGetDouble(POSITION_PROFIT))          // Maximal LOSS position and Symbol
        { MaxLosPos=PositionGetDouble(POSITION_PROFIT); MaxLosSym=PositionGetSymbol(EI); }
      if(MaxProPos<PositionGetDouble(POSITION_PROFIT))
        { MaxProPos=PositionGetDouble(POSITION_PROFIT); MaxProSym=PositionGetSymbol(EI); }
     }

  }

void BUY()  // send order is BUY, Position can be ANY !!!
  {
   R.action=TRADE_ACTION_DEAL;
   R.symbol=S[I];
   R.price=T.ask;
   R.sl=0.0;
   R.deviation=99;
   R.type=ORDER_TYPE_BUY;
   R.type_filling=ORDER_FILLING_FOK; // or ORDER_FILLING_RETURN
   switch(SPos[I])
     { case PNon  : 
        {
         R.tp=NormalizeDouble(T.ask+TP,(uchar)SymbolInfoInteger(S[I],SYMBOL_DIGITS));
         R.volume=LotMin;
         R.comment="OPEN_BUY "+DoubleToString(V[ValueToIndex(Val1)],3)+" : "+
                   DoubleToString(V[ValueToIndex(Val2)],3); break; 
        }                         // New position
      case PSell : 
        {
         R.tp=PositionGetDouble(POSITION_TP);
         if(CloseOne)
           {
            R.volume=LotMin;
            R.comment=Reason; 
           }                                                              // Losing close
         else
           {
            R.volume=LotMin;
            R.comment="PART_CLOSE "+DoubleToString(PositionGetDouble(POSITION_PROFIT),2)+" / "+
                      DoubleToString(PositionGetDouble(POSITION_VOLUME),2); 
           }       // Part close
         break; 
        }
      case PBuy  : 
        {
         R.tp=PositionGetDouble(POSITION_TP);
         R.volume=LotMin;
         R.comment="ADD_BUY "+DoubleToString(V[ValueToIndex(Val1)],3)+" : "+
                   DoubleToString(V[ValueToIndex(Val2)],3); break; 
        }                         // Increase
     } // end :switch
   Exposure();
   Out=" POSITIONS [EUR-lot] = "+DoubleToString(LotP,2)+"  FreeBalance="+DoubleToString(FreeBalance,2)+
       "\n EXPOSURE [EUR-lot] = "+DoubleToString(LotV,2)+" :";
   for(J=0;J<Vmax;J++) Out=Out+"  "+IndexToValue(J)+"="+DoubleToString(V[J],3);
   Print(Out);
   OrderSend(R,D);
   Print("1->","OrderSend_BUY_",S[I],"@_",DoubleToString(R.price,SDig)," RetCode=",D.retcode);
  }

void SELL()   // send order is SELL, Position can be ANY !!!
  {
   R.action=TRADE_ACTION_DEAL;
   R.symbol=S[I];
   R.price=T.bid;
   R.sl=0.0;
   R.deviation=99;
   R.type=ORDER_TYPE_SELL;
   R.type_filling=ORDER_FILLING_FOK; // or ORDER_FILLING_RETURN
   switch(SPos[I])
     { case PNon  : 
        {
         R.tp=NormalizeDouble(T.bid-TP,(uchar)SymbolInfoInteger(S[I],SYMBOL_DIGITS));
         R.volume=LotMin;
         R.comment="OPEN_SELL "+DoubleToString(V[ValueToIndex(Val1)],3)+" : "+
                   DoubleToString(V[ValueToIndex(Val2)],3); break; 
        }                    // New position
      case PBuy  : 
        {
         R.tp=PositionGetDouble(POSITION_TP);
         if(CloseOne)
           {
            R.volume=LotMin;
            R.comment=Reason; 
           }                                                               // Losing close
         else
           {
            R.volum

Показано первые 50% кода (символов: 14457)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 445,70₽ ≈ $17.67