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

serg_martini2.mq4

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

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

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

О программе

Данный исходный код представляет собой торгового советника (эксперта) для платформы MetaTrader 4 на языке MQL4. Советник управляет сеткой ордеров, создавая начальные позиции на покупку и продажу, а также размещая дополнительные лимитные и стоповые ордера на последующих уровнях. Он выполняет модификацию существующих ордеров, изменяя их стоп-лосс и тейк-профит, а также удаляет устаревшие ордера при определённых условиях. Между операциями реализована задержка для контроля потока запросов к торговому серверу.

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

НастройкаОписание
StartLots Начальный лот — Начальный размер лота для открытия новых позиций и ордеров.
Step Шаг — Величина шага в пунктах, используемая для расчёта цен размещения ордеров и уровней.
StepFactor Множитель шага — Множитель, применяемый для увеличения шага на последующих уровнях ордеров.
TimeOut Таймаут — Задержка между торговыми операциями в миллисекундах.
Получить полный код

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

/*
???????? ???????? ?????? ?? ???????????
***************************************
??????? ????????? ??????? ??????????? ???????
101.102.103.104.105 - ?????????????? ?????? ?? ???
201.202.203.204.205 - ?????????????? ?????? ?? ????
*/

extern double StartLots = 0.1;
extern double Step = 20;
extern double StepFactor = 1;

extern double TimeOut = 5000;

void setNewTakeProfitBuy(double NewTP) { 
   int TotalOrd, TekOrd, Tiket, Error;
   TotalOrd = OrdersTotal();
   for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber() >= 101 &&  OrderMagicNumber() <= 105) {
         if (NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(NewTP, Digits) ) {
            Tiket = OrderModify(OrderTicket(), OrderOpenPrice(), 0, NewTP, 0, Green);
            Print ("??????????? TP ??? OP_BUY. TP_New = ", OrderTakeProfit(), "->", NewTP, "  lots= ", OrderLots(), " num= ", OrderTicket());
            Print ("????????? = ",Tiket);
            if (Tiket !=1 ) {Error = GetLastError(); Print ("?????? = ", Error); }                  
            Sleep(TimeOut);
         }
      }
   }  
}

void setNewTakeProfitSel(double NewTP) { 
   int TotalOrd, TekOrd, Tiket, Error;
   TotalOrd = OrdersTotal();
   for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderType()==OP_SELL  && OrderMagicNumber() >= 201 &&  OrderMagicNumber() <= 205) {
         if ( NormalizeDouble(OrderTakeProfit(),Digits) != NormalizeDouble(NewTP, Digits) ) {
            Tiket = OrderModify(OrderTicket(), OrderOpenPrice(), 0, NewTP, 0, Yellow);
            Print ("??????????? TP ??? OP_SELL. TP_New = ", OrderTakeProfit(), "->", NewTP, "  lots= ", OrderLots(), " num= ", OrderTicket() );
            Print ("????????? = ",Tiket);
            if (Tiket !=1 ) {Error = GetLastError(); Print ("?????? = ", Error); }                  
            Sleep(TimeOut);
         } 
      }
   }   
}

double getNextOrderPriceByNum(int n1, double p1){
   switch (n1) {
      case 101: return (p1-Step*Point); //??? ?????? ???? ?????????? ?????? ???? ?? ??? ? ?????? ???????
      case 102: return (p1-Step*MathPow(StepFactor,1)*Point);
      case 103: return (p1-Step*MathPow(StepFactor,2)*Point);
      case 104: return (p1-Step*MathPow(StepFactor,3)*Point);   
      case 201: return (p1+Step*Point); //??? ?????? ???? ?????????? ?????? ???? ?? ??? ? ?????? ???????  
      case 202: return (p1+Step*MathPow(StepFactor,1)*Point);
      case 203: return (p1+Step*MathPow(StepFactor,2)*Point);
      case 204: return (p1+Step*MathPow(StepFactor,3)*Point);   
   }
   return (0);        
}

int modOrder(int num, double oprice, double prprice){
    int t, cnt1, tic, err;
    double p1, p2;
    t=OrdersTotal();
    for(cnt1=0;cnt1<t;cnt1++){
       OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==num){ 
          if ((OrderOpenPrice()!=oprice || OrderTakeProfit()!=prprice) && oprice!=0 && prprice!=0) {     
             if (OrderType()==OP_BUYLIMIT){
                p1=oprice;
                p2=prprice;

               if (NormalizeDouble(OrderOpenPrice(),Digits)!=NormalizeDouble(p1,Digits) || NormalizeDouble(OrderTakeProfit(),Digits)!=NormalizeDouble(p2,Digits) ) { 

                  tic=OrderModify(OrderTicket(),p1,0,p2,0,Red);
                  Print ("????? BUYLIMIT ", OrderOpenPrice(), "->", p1, " t/p ", OrderTakeProfit(),"->", p2);
                  Print ("????????? = ",tic);
                  if (tic!=1) {err=GetLastError(); Print ("?????? = ",err);}                     
                Sleep(TimeOut);
                 }
              }
              if (OrderType()==OP_SELLLIMIT){
                  p1=oprice;
                  p2=prprice;
                 if (NormalizeDouble(OrderOpenPrice(),Digits)!=NormalizeDouble(p1,Digits) 
                     || NormalizeDouble(OrderTakeProfit(),Digits)!=NormalizeDouble(p2,Digits)) { 
                      tic=OrderModify(OrderTicket(),p1,0,p2,0,Green);
                      Print ("????? SELLLIMIT ", OrderOpenPrice(), "->", p1, " t/p ", OrderTakeProfit(),"->", p2);
                      Print ("????????? = ",tic);
                      if (tic!=1) {err=GetLastError();
                      Print ("?????? = ",err);}                       
                      Sleep(TimeOut);
                  }                       
              }              
            }
          }
      }  
      return (1);      
     }    

bool isMagNum(int mode, int num) { 
   int TotalOrd, TekOrd;     
   TotalOrd = OrdersTotal();
   for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
      if (mode == 1) {
         if (OrderMagicNumber()==num && OrderSymbol()==Symbol()) return (True); // ???????????? ????????
      }
      if (mode == 2) {
         if (OrderMagicNumber()==num && OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) ) return (True); // ???????????? ????????
      }
   }  
return (False); }

bool isOrderActive(int num) {       
   int TotalOrd, TekOrd;     
   TotalOrd = OrdersTotal();
   for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()== num && (OrderType()==OP_BUY || OrderType()==OP_SELL)) { return (True); } // ???????????? ????????
   }  
   return (False);   
} 

int getMaxLongNum(){
   int topL = 0, TotalOrd, TekOrd;
   TotalOrd = OrdersTotal();
   for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()>topL) topL = OrderMagicNumber(); 
   }  
   return (topL); // ???????????? ?????????? ????? ??????    
}

int getMaxShortNum(){
   int topL = 0, TotalOrd, TekOrd;
   TotalOrd = OrdersTotal();
   for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()>topL ) topL = OrderMagicNumber();
   }  
   return (topL); // ???????????? ?????????? ????? ??????
}

int getTopLevel (int mode) {       
   int TotalOrd, TekOrd, MaxLevel, cLev=0;
   TotalOrd = OrdersTotal();
   if (mode == 1) { //???????? ?????? ??? ??????
      for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol()==Symbol() && OrderType()==OP_BUY ) { //?????? ?????????????? ???????
            switch (OrderMagicNumber()) {
               case 105: cLev=5; break; 
               case 104: cLev=4; break;
               case 103: cLev=3; break;
               case 102: cLev=2; break;
               case 101: cLev=1; break;
            } 
            if (cLev > MaxLevel) MaxLevel = cLev;   
         }  
      }    return (MaxLevel);   
   }  

   if (mode == 2) { //???????? ?????? ??? ??????
      for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol()==Symbol() && OrderType()==OP_SELL ) { //?????? ?????????????? ???????
            switch (OrderMagicNumber()) {
               case 205: cLev=5; break; 
               case 204: cLev=4; break;
               case 203: cLev=3; break;
               case 202: cLev=2; break;
               case 201: cLev=1; break;             
            } 
            if (cLev > MaxLevel) MaxLevel = cLev;   
         }  
      }  return (MaxLevel); 
   }
}

double getOrderPriceByNum (int num) {       
   int t, cnt1;     
   t=OrdersTotal();
   for(cnt1=0;cnt1<t;cnt1++){
      OrderSelect(cnt1, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol()==Symbol() && OrderMagicNumber()== num) { return (OrderOpenPrice()); }
   }  
   return (0);   
}

int getNextOrderNum(int n1){
   switch (n1) {
      case 101: return (102); 
      case 102: return (103); 
      case 103: return (104); 
      case 104: return (105); 
      case 201: return (202); 
      case 202: return (203); 
      case 203: return (204); 
      case 204: return (205); 
    }
    return (0);       
}

double getLotByLevel(int Level) {       
   double Lot1;
   Lot1 = StartLots;//???????? ?? ?????????
   switch( Level ) {
      case 3: Lot1 = StartLots*2; break;
      case 4: Lot1 = StartLots*4; break;
      case 5: Lot1 = StartLots*8; break;
   }
   return (Lot1);
}

void Create_Prima_Buy() { 
   int Tiket, Error;
   Tiket = OrderSend(Symbol(), OP_BUY, StartLots, Ask,  3,  0, Ask+Step*Point,"101 ?????? ??????? ??????", 101,0, Red);
   Print("???????? ?????? ??????? ????? ?????? 101 ??? -> ",Symbol(),"  Ask = ", Ask,"  T/P = ",Ask+Step*Point,"  ?i?et = ",Tiket);
   if ( Tiket == -1 ) {Error = GetLastError(); Print ("?????? ???????? ?????? ??????? ?????? 101 = ",Error); } 
   Sleep(TimeOut);
}

void Create_Prima_Sell() { 
   int Tiket, Error;
   Tiket = OrderSend(Symbol(), OP_SELL, StartLots, Bid,3,0,Bid-Step*Point,"201 ?????? ??????? ??????", 201, 0, Green);
   Print("???????? ?????? ??????? ????? ?????? 201 ??? -> ",Symbol(),"  Bid = ", Bid, " ?/? = ", Bid-Step*Point, "  ?iket = ",Tiket);
   if (Tiket == -1) {Error = GetLastError(); Print ("?????? ???????? ?????? ??????? ????? ?????? 201 = ", Error); } 
   Sleep(TimeOut);
}   

void Create_Modify_Prima_BuyStop() { 
   int TotalOrd, TekOrd;     
   int Tiket, Error;
   int MaxMagNumBuy;       // ????? ?????????? ???????????? ?????????? ????? ????????? ?????? ??? ??????
   double OrderPriceBuy ;  // ???? ???????? ?????? ?? ??? ??????????? ??????
   double PriceBuyStop; // ???? ???????? ??????????? ?????? STOP

   MaxMagNumBuy  = getMaxLongNum();                    // ????? ?????????? ???????????? ?????????? ????? ????????? ?????? ??? ??????
   OrderPriceBuy = getOrderPriceByNum( MaxMagNumBuy ); // ????????? ???? ???????? ?????? ?? ??? ??????????? ??????
   PriceBuyStop  = OrderPriceBuy + Step*Point + (Point * MarketInfo(Symbol(),MODE_SPREAD) ); // ???? ???????? ??????????? ?????? STOP

   if (isMagNum(2,101) == False) { //--- ???? ??? ?? ??????? ?????
      Tiket = OrderSend(Symbol(), OP_BUYSTOP, StartLots, PriceBuyStop,  3,  0, PriceBuyStop + Step*Point,"BUY_STOP_?101", 101,0, Red);
      Print("???????? BUY_STOP_?101 ??? -> ",Symbol(),"  Ask = ", PriceBuyStop,"  T/P = ",PriceBuyStop+Step*Point,"  ?i?et = ",Tiket);
      if ( Tiket == -1 ) {Error = GetLastError(); Print ("?????? ???????? BUY_STOP_?101 = ",Error); } 
      Sleep(TimeOut); }
   else { //--- ????? ????????? ??? ? ???? ???? ???????????? ???
      TotalOrd = OrdersTotal();
      for(TekOrd = 0; TekOrd < TotalOrd; TekOrd++) { OrderSelect(TekOrd, SELECT_BY_POS, MODE_TRADES);
         if (OrderMagicNumber()==101 && OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP ) { // ????? ?????????? ????? BUY_STOP
            if (NormalizeDouble(OrderOpenPrice(),Digits)!=NormalizeDouble(PriceBuyStop,Digits) || NormalizeDouble(OrderTakeProfit(),Digits)!=NormalizeDouble((PriceBuyStop + Step*Point),Digits) ) { 
               Tiket = OrderModify(OrderTicket(),PriceBuyStop,0,(PriceBuyStop + Step*Point),0,Red);
               Print ("??????????? BUY_STOP_?101 ", OrderOpenPrice(), "->", PriceBuyStop, " t/p = ", OrderTakeProfit(),"  -> ", (PriceBuyStop + Step*Point));
               if ( Tiket == 0 ) {Error = GetLastError(); Print ("?????? ??????????? BUY_STOP_?101 = ",Error); } 
               Sleep(TimeOut); break;
            }
         }
      }  
   }
}

void Create_Modify_Prima_SellStop() { 
   int TotalOrd, TekOrd;     
   int Tiket, Error;
   int MaxMagNumSell;       // ????? ?????????? ???????????? ?????????? ????? ????????? ?????? ??? ??????
   double OrderPriceSell ;  // ???? ???????? ?????? ?? ??? ??????????? ??????
   double PriceSellStop; // ???? ???????? ??????????? ?????? STOP

   MaxMagNumSell  = getMaxShortNum();                     // ????? ?????????? ???????????? ?????????? ????? ????????? ?????? ??? ??????
   OrderPriceSell = getOrderPriceByNum( MaxMagNumSell ); // ????????? ???? ???????? ?????? ?? ??? ??????????? ??????
   PriceSellStop  = OrderPriceSell - Step*Point - (Point * MarketInfo(Symbol(),MODE_SPREAD) ); // ???? ???????? ??????????? ?????? STOP

   if (isMagNum(2,201) == False) { //--- ???? ??? ?? ??????? ?????
      Tiket = Orde

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

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

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

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

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

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

Стоимость полного кода
1 931,10₽ ≈ $23.60