MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1546

 
MakarFX :
Manuel olarak verilen siparişlere eşlik eden bir danışmanınız var mı?
Evet. Gecikmeleri manuel olarak ayarlıyorum veya sadece bir anlaşma açıyorum ve ardından danışman çalışıyor.
 
SGarnov :
Derlemeyen bir şey eklemeye çalıştım. Tüm kodları ifşa ediyorum, ihtiyaç olursa derleme ekranını ifşa edeceğim. Ayrıca bir sorun olabileceğini düşünüyorum, almam katsayı (dış değişken) üzerinden durma ile ilgili olarak ayarlandı, manuel bir ayara değiştirilebilir mi ve danışmanın eklemesi daha kolay olur mu?

İşlev

   double GetPointLastLoss(){
             datetime t= 0 ;
             double result= 0 ,p= 0 ,tp= 0 ;
             int i=OrdersHistoryTotal(),magic= 0 ;
         for ( int pos= 0 ; pos<i; pos++)
         {
           if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
         {
           if ((OrderSymbol()== _Symbol ) && (OrderMagicNumber()==magic))
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime())
                 {t=OrderCloseTime(); p=OrderProfit(); tp=OrderType();
                   if (tp==OP_BUY&&p< 0 )
                    {
                     result=OrderOpenPrice()-OrderClosePrice();
                    } else {result= 0 ;}
                   if (tp==OP_SELL&&p< 0 )
                    {
                     result=OrderClosePrice()-OrderOpenPrice();
                    } else {result= 0 ;}
                 }
              }
           }
        }
     }
   return (result);
  }

global kapsamdan çıkarın. magic=0 derleme için takıldı.

magic= 0

	          
 
Galim_V :

İşlev

global kapsamdan çıkarın. magic=0 derleme için takıldı.

Kaldırıldı, derleme hatası yok, tp=0 sütunundaki işlevin üçüncü satırında harici değişken int tp=0 referans alınarak yalnızca 1 uyarı çıkıyor. Neyi sevmediğini tam olarak anlamıyorum. Tüm kodu ekliyorum, düzeltmek zor değilse, gerçek yakınlarda bir yerdedir.

 input int takeProfitC = 2 ; // Коэффициент Take Profit
input int stop_loss = 100 ; //Уровень Stop Loss
input int stop_count = 2 ; //Количество Stop Loss
input double lots = 0.01 ; //Лоты
input int slippage = 30 ; //Проскальзывание
input int datePeriod = 48 ; // Время удержания при SL


int tp = 0 ;
int tpc = 0 ;
double tp_price_old = 777 ;
int stopLossCount = 0 ;
datetime startOrder = 0 ;
int pending_ticket = 0 ;
int lastMagic = 0 ;
bool isLimitOn = false ;
bool isStart = True;
datetime startTime = 0 ;
bool isFinal = false ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit () {
//
   //OrderSend(Symbol(), OP_SELL, 0.01, 0.76228, 300, 0, 0);
   //OrderSend(Symbol(), OP_SELLSTOP, 0.01, 0.77057, 300, 0, 0);
   //OrderSend(Symbol(), OP_BUYSTOP, 0.01, 0.76928, 300, 0, 0);
   tp = stop_loss * takeProfitC;
//---
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason) {
//--

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick () {
//---
//Comment("StopCount: " + stopLossCount + "\n" + "CurrentStopC: " + stop_count);
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS)) {
         if (OrderSymbol() == Symbol ()) {
         int magic = OrderMagicNumber();
             if ((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderOpenTime()) {
               int ticket = OrderTicket();
               if (!findPending(ticket)) {
                   if ( OrderSelect (ticket, SELECT_BY_TICKET) && ((( TimeCurrent () <= (startTime + datePeriod * 3600 ))) || isStart)) {
                     if (OrderType() == OP_BUY) {
                         double sl_price = NormalizeDouble (OrderOpenPrice() - Point () * MathMax (stop_loss, MarketInfo( Symbol (), MODE_STOPLEVEL)), Digits );
                         double tp_price = NormalizeDouble ((OrderOpenPrice() + Point () * (tp)), Digits );
                         if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl_price, tp_price, OrderExpiration())) {
                           Print ( "Ошибка модификации ордера:" , GetLastError ());
                        } else {
                           if (stopLossCount < stop_count && tp_price != tp_price_old){
                              pending_ticket = OrderSend ( Symbol (), OP_SELLSTOP, lots, sl_price, slippage, 0 , 0 , NULL , OrderTicket());
                              lastMagic = ticket;
                              isLimitOn = true ;
                               if (isStart){
                                 startTime = TimeCurrent ();
                                 isStart = false ;
                              }
                              tp_price_old = tp_price;
                              stopLossCount++;                         
                           }
                        }
                     } else if (OrderType() == OP_SELL) {
                         double sl_price = NormalizeDouble (OrderOpenPrice() + Point () * MathMax (stop_loss, MarketInfo( Symbol (), MODE_STOPLEVEL)), Digits );
                         double tp_price = NormalizeDouble ((OrderOpenPrice() - Point () * (tp)), Digits );
                         if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl_price, tp_price, OrderExpiration())) {
                           Print ( "Ошибка модификации ордера:" , GetLastError ());
                        } else {
                           if (stopLossCount < stop_count && tp_price != tp_price_old){
                              pending_ticket = OrderSend ( Symbol (), OP_BUYSTOP, lots, sl_price, slippage, 0 , 0 , NULL , OrderTicket());
                              lastMagic = ticket;
                              isLimitOn = true ;
                               if (isStart){
                                 startTime = TimeCurrent ();
                                 isStart = false ;
                              }
                              stopLossCount++;
                              tp_price_old = tp_price;  
                          }
                        }
                     }
                  }
               }
         }
         if (startTime > 0 && ( TimeCurrent () >= (startTime + datePeriod * 3600 ))){
            deletePending(lastMagic);
            isFinal = true ;
         }
            
         if (lastMagic != 0 && !IsSell() && !IsBuy() && magic == lastMagic) {
            tpc = 0 ;
            startTime = 0 ;
            stopLossCount = 0 ;
            deletePending(lastMagic);
            isStart = true ;
            }
         }
     }
   }
   if ((startTime > 0 || isFinal) && !IsSell() && !IsBuy()){
            tpc = 0 ;
            startTime = 0 ;
            stopLossCount = 0 ;
            isStart = true ;
            isFinal = false ;
   }
}
//+----------------------------------------------------------------------------+
//|  Возвращает пункты убытка последнего закрытого ордера в пунктах            |
//+----------------------------------------------------------------------------+
double GetPointLastLoss(){
             datetime t= 0 ;
             double result= 0 ,p= 0 ,tp= 0 ;
             int i=OrdersHistoryTotal(),magic= 0 ;
         for ( int pos= 0 ; pos<i; pos++)
         {
           if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
         {
           if ((OrderSymbol()== _Symbol ) && (OrderMagicNumber()==magic))
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime())
                 {t=OrderCloseTime(); p=OrderProfit(); tp=OrderType();
                   if (tp==OP_BUY&&p< 0 )
                    {
                     result=OrderOpenPrice()-OrderClosePrice();
                    } else {result= 0 ;}
                   if (tp==OP_SELL&&p< 0 )
                    {
                     result=OrderClosePrice()-OrderOpenPrice();
                    } else {result= 0 ;}
                 }
              }
           }
        }
     }
   return (result);
  }                                                                
//+------------------------------------------------------------------+
bool findPending( int ticket) {
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS)) {
         if (OrderMagicNumber() == ticket) {
             return true ;
         }
      }
   }

   for ( int i = OrdersHistoryTotal() - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber() == ticket) {
             return true ;
         }
      }
   }
   return false ;
}
//+------------------------------------------------------------------+
void deletePending( int magic) {
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS)) {
         if (OrderMagicNumber() == magic) {
             if (OrderType() != OP_BUY && OrderType() != OP_SELL) {
               if (!OrderDelete(OrderTicket())) {
                   Print ( "Ошибка удаления отложеного одера: " , GetLastError ());
               }
            }
             break ;
         }
      }
   }
}
//+------------------------------------------------------------------+
bool IsSell()
{
   int count = 0 ;
   for ( int trade = OrdersTotal () - 1 ; trade >= 0 ; trade--)
   {
       if ( OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) 
          && OrderSymbol() == Symbol ()
          && OrderType() == OP_SELL)
      {
         count++;
      }
      
   }
   if (count == 0 )
       return false ;
   else
       return true ;
}
//+------------------------------------------------------------------+
bool IsBuy()
{
   int count = 0 ;
   for ( int trade = OrdersTotal () - 1 ; trade >= 0 ; trade--)
   {
       if ( OrderSelect (trade, SELECT_BY_POS, MODE_TRADES) 
          && OrderSymbol() == Symbol ()
          && OrderType() == OP_BUY)
      {
         count++;
      }
      
   }
   if (count == 0 )
       return false ;
   else
       return true ;
}
 
SGarnov :

Kaldırıldı, derleme hatası yok, tp=0 sütunundaki işlevin üçüncü satırında harici değişken int tp=0 referans alınarak yalnızca 1 uyarı çıkıyor. Neyi sevmediğini tam olarak anlamıyorum. Tüm kodu ekliyorum, düzeltmek zor değilse, gerçek yakınlarda bir yerdedir.

Bunun gibi

 //+------------------------------------------------------------------+
//|                                                   SGarnov.v2.mq4 |
//|                                           Copyright 2020, DrMak. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, DrMak."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property strict
//--- input parameters
input int       T_Profit = 2 ;     // Коэффициент Take Profit
input int       S_Loss   = 100 ;   // Уровень Stop Loss
input double    O_Lots   = 0.01 ;   //Лоты
input int       Input4;
input int       Input5;
input int       Input6;

double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- 
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   t_profit = S_Loss*T_Profit;
   s_loss   = MathMax (S_Loss, MarketInfo( Symbol (), MODE_STOPLEVEL));
   // Проверяем наличие ордеров BUY
   if (CountOrders( _Symbol , 0 )> 0 )
     {
       // Проверяем последний закрытый ордер SELL на наличие убытка в пунктах
       if (GetPointLastLoss( 1 )> 0 )
        {
         // Если убыток есть, то добавляем пункты убытка
         sl_price = NormalizeDouble ( Point () * s_loss, Digits );
         tp_price = NormalizeDouble (GetPointLastLoss( 1 )+ Point () * t_profit, Digits );
         ModifyOrder( _Symbol , sl_price, tp_price);
        }
       else
        {
         // Если убытка нет
         sl_price = NormalizeDouble ( Point () * s_loss, Digits );
         tp_price = NormalizeDouble ( Point () * t_profit, Digits );
         ModifyOrder( _Symbol , sl_price, tp_price);
        }
     }
   // Проверяем наличие ордеров SELL
   if (CountOrders( _Symbol , 1 )> 0 )
     {
       // Проверяем последний закрытый ордер BUY на наличие убытка в пунктах
       if (GetPointLastLoss( 0 )> 0 )
        {
         // Если убыток есть, то добавляем пункты убытка
         sl_price = NormalizeDouble ( Point () * s_loss, Digits );
         tp_price = NormalizeDouble (GetPointLastLoss( 0 )+ Point () * t_profit, Digits );
         ModifyOrder( _Symbol , sl_price, tp_price);
        }
       else
        {
         // Если убытка нет
         sl_price = NormalizeDouble ( Point () * s_loss, Digits );
         tp_price = NormalizeDouble ( Point () * t_profit, Digits );
         ModifyOrder( _Symbol , sl_price, tp_price);
        }
     }
  }
//+--------------------------------------------------------------------------------------------------------------------+
//| Подсчет ордеров по типу                                                                                            |
//+--------------------------------------------------------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL                                                                 |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT                                                            |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP                                                             |
//|  6 - ордера типа Balance     -1 - Все типы ордеров                                                                 |
//+--------------------------------------------------------------------------------------------------------------------+
int CountOrders( string symb= "" , int or_ty=- 1 ) 
  {
   int cnt= 0 ;
   if (symb== "0" ) symb= _Symbol ;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS)== true )
        {
         if (OrderSymbol()==symb || symb== "" )
           {
             if (or_ty< 0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return (cnt);
  }
//+----------------------------------------------------------------------------+
//| Модификация ордера                                                         |
//+----------------------------------------------------------------------------+
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//+----------------------------------------------------------------------------+
void ModifyOrder( string symb= "" , double sl= 0 , double tp= 0 )
  {
   if (symb== "0" ) symb= _Symbol ;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS)== true )
        {
         if (OrderSymbol()==symb || symb== "" )
           {
             if (OrderStopLoss()== 0 )
              {
               if (OrderType()==OP_BUY)
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-sl_price, OrderOpenPrice()+tp_price, OrderExpiration()))
                    { Print ( "Ордер модифицирован" );}
                   else
                    { Print ( "Ошибка модификации ордера:" , GetLastError ());}
                 }
               if (OrderType()==OP_SELL)
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+sl_price, OrderOpenPrice()-tp_price, OrderExpiration()))
                    { Print ( "Ордер модифицирован" );}
                   else
                    { Print ( "Ошибка модификации ордера:" , GetLastError ());}
                 }
              }
           }
        }
     }
  }
//+----------------------------------------------------------------------------+
//|  Возвращает пункты убытка последнего закрытого ордера в пунктах            |
//|  0 - последний ордер BUY                                                   |
//|  1 - последний ордер SELL                                                  |
//+----------------------------------------------------------------------------+
double GetPointLastLoss( int or_ty=- 1 )
  {
   datetime t= 0 ;
   double result= 0 ,p= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if ((OrderSymbol()== _Symbol ))
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime())
                 {t=OrderCloseTime(); p=OrderProfit(); or_ty=OrderType();
                   if (or_ty==OP_BUY&&p< 0 )
                    {
                     result=OrderOpenPrice()-OrderClosePrice();
                    } else {result= 0 ;}
                   if (or_ty==OP_SELL&&p< 0 )
                    {
                     result=OrderClosePrice()-OrderOpenPrice();
                    } else {result= 0 ;}
                 }
              }
           }
        }
     }
   return (result);
  }
//+------------------------------------------------------------------+

Senin durumunda, sihire hiç gerek yok

 
MakarFX :

Bunun gibi

Senin durumunda, sihire hiç gerek yok

Teşekkürler, test edip geri bildireceğim. Umarım benimki kadar iyi çalışır, ancak yeni çekime bir durak (işe yaradıysa) ekler.

Ve Input4'ün harici parametreleri nelerdir; 5; 6?

 
SGarnov :
Teşekkürler, test edip geri bildireceğim. Umarım benimki kadar iyi çalışır, ancak yeni çekime bir durak (işe yaradıysa) ekler.

Bu sadece bir değişiklik. Sipariş silme veya geri alma yok.

Danışmanın ne yapması gerektiğini anlatırsanız yardımcı olmaya çalışırım.

 
SGarnov :

Ve Input4'ün harici parametreleri nelerdir; 5; 6?

silmeyi unuttum
 
MakarFX :

Danışmanın ne yapması gerektiğini anlatırsanız yardımcı olmaya çalışırım.

Satın almak için bekleyen bir emir koydum - danışman çalışıyor - bekleyen emir tetiklendi - danışman bunu "görüyor" ve bu açık siparişe koyuyor:

kaybı durdur (harici parametre ayarlarda ayarlanır);

kar al (ayarlarda bir katsayı aracılığıyla harici bir parametre ayarlanır, örneğin 1 ila 2);

zararı durdur seviyesinde satış yapmak için bekleyen bir emir .

Olası senaryolar.

Seçenek 1.

A) Fiyat alıma ulaşırsa, danışman zararı durdur ve bekleyen satış emrini kaldırır;

Seçenek 2.

B) Stoploss tetiklendiyse ve "işlem geçmişine gittiyse":

Bir satış emri açıldı ve EA bu siparişe aşağıdakileri yeniden yerleştirdi:

kaybı durdur (harici parametre ayarlarda ayarlanır);

geçmişten kâr + tetiklenen zararı durdur;

zararı durdur seviyesinde satın almak için bekleyen bir emir.

Fiyat alıma ulaştı - danışman zararı durdur ve bekleyen satın alma emrini kaldırır.

Ve tam tersi, iş bekleyen bir satışla başlarsa.

Ve böylece danışman, "Zarar Durdurma Sayısı" harici parametresi üzerindeki çalışmasını durdurana kadar çalışır (benim durumumda 2'dir - bu, 2. seçeneğin 3 kez tekrarlanacağı ve danışmanın gelecekte çalışmayı durduracağı ve tümünü kaldıracağı anlamına gelir. bekleyen emirleri hesaba katarak ilk durak gitmez).

İkinci varyantta hedefe bir durak eklenir. alıma ulaşılmazsa ve 2. seçenek tekrarlanırsa, belirtilen harici parametre "Zararı Durdurma numarası"na bağlı olarak alıma 2 durak eklenir ve bu şekilde devam eder.


Gönderdiğim kod, tarif ettiğim sorun dışında olması gerektiği gibi çalışıyor (geçmişte almaya eklenmesi gereken 1 durak veya 2 durak görmüyor).

Bunun gibi bir şey.

 
SGarnov :

Satın almak için bekleyen bir emir koydum - danışman çalışıyor - bekleyen emir tetiklendi - danışman bunu "görüyor" ve bu açık siparişe koyuyor:

kaybı durdur (harici parametre ayarlarda ayarlanır);

kar al (ayarlarda bir katsayı aracılığıyla harici bir parametre ayarlanır, örneğin 1 ila 2);

zararı durdur seviyesinde satış yapmak için bekleyen bir emir .

Olası senaryolar.

Seçenek 1.

A) Fiyat alıma ulaşırsa, danışman zararı durdur ve bekleyen satış emrini kaldırır;

Seçenek 2.

B) Stoploss tetiklendiyse ve "işlemlerin geçmişine gittiyse":

Bir satış emri açıldı ve EA bu siparişe aşağıdakileri yeniden yerleştirdi:

kaybı durdur (harici parametre ayarlarda ayarlanır);

geçmişten kâr + tetiklenen zararı durdur;

zararı durdur seviyesinde satın almak için bekleyen bir emir.

Fiyat alıma ulaştı - danışman zararı durdur ve bekleyen satın alma emrini kaldırır.

Ve tam tersi, iş bekleyen bir satışla başlarsa.

Ve böylece danışman, "Zarar Durdurma Sayısı" harici parametresi üzerindeki çalışmasını durdurana kadar çalışır (benim durumumda 2'dir - bu, 2. seçeneğin 3 kez tekrarlanacağı ve danışmanın gelecekte çalışmayı durduracağı ve tümünü kaldıracağı anlamına gelir. bekleyen emirleri hesaba katarak ilk durak gitmez).

İkinci varyantta hedefe bir durak eklenir. alıma ulaşılmazsa ve 2. seçenek tekrarlanırsa, belirtilen harici parametre "Zararı Durdurma numarası"na bağlı olarak alıma 2 durak eklenir ve bu şekilde devam eder.


Gönderdiğim kod, tarif ettiğim sorun dışında olması gerektiği gibi çalışıyor (geçmişte almaya eklenmesi gereken 1 durak veya 2 durak görmüyor).

Bunun gibi bir şey.

"Zarar Durdurma Sayısı" - art arda mı yoksa mevcut gün için mi?

 
MakarFX :

"Zarar Durdurma Sayısı" - art arda mı yoksa mevcut gün için mi?

Bir döviz çifti için art arda durak sayısı.

Danışman birkaç döviz çifti üzerinde durur ve geçmişe birkaç durak girer ve farklı sıralarda, geçmişi anlamak için danışman başlangıçta emirleri ID'lerle işaretler ancak geçmişte bulamaz, OrderMagikNumber()'ın görüneceğini düşündüm. onlar için. Belki de farklı döviz çiftlerinden gelen stopların tarihinde, danışmanın onları "görmeyi" bırakması nedeniyle?Bir çift üzerinde danışman olarak çalışmaya çalışmadım ve o zaman bundan bir anlamı olmayacak.

kaynağı tekrar yaz? Düzeltmesi gereken tek şey, "tarihten stop işlemlerini aramak ve yeni yerleştirilen alıma eklemesini sağlamaktır".