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

 
Alexey Viktorov :

Kendi bellek çipimden bahsediyordum. :)))

Kod yazarken kolayca iki kez kontrol edilebilecek, açıklığa kavuşturulabilecek, olması gerektiği gibi yapılabilecek ve tekrar unutulabilecek önemsiz şeyleri hatırlamıyorum.

Apaçık! :)
 
Artyom Trishkin :
İnsanların genellikle sondaki veya başabaş işlevini sorduğunu fark ettim. Burada, stop'u belirli bir başabaş seviyesine taşımak ve fiyat grafiğinde çizgilerini çizen fonksiyona (örneğin MA veya parabolik) geçen bir göstergenin değerine göre pozisyon stopunu takip etmek için bir saplama işlevi ekledim.

#property strict // в самое начало кода вашей программы (если нету там ещё)


// Функцию - за пределы остальных функций программы
//+------------------------------------------------------------------+
//| Трейлинг по значению + перенос стопа на уровень безубытка        |
//+------------------------------------------------------------------+
void TrailingByLevel( string symbol_name,           // Имя символа
                     int magic_number,             // Magic ордера
                     double level_of_trail,         // Уровень, на который ставим стоп (например МА или Parabolic SAR)
                     int trailing_start,           // Профит в пунктах для старта трала
                     int trailing_step,             // Шаг трала в пунктах
                     int trailing_stop,             // Отступ стоплосс от уровня МА или SAR в пунктах
                     int profit_for_breakeven= 15 ,   // Профит в пунктах для переноса стопа в безубыток
                     int breakeven_level= 5 ,         // Уровень безубытка в пунктах
                     bool use_trail= true ,           // Флаг использования трала
                     bool use_breakeven= false        // Флаг использования безубытка
                     )
   {
   int lv=StopLevel(symbol_name)+ 1 ;                 // Получаем значение Stop Level по символу + 1 пункт (из отдельной функции)
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS )) {
         if ( OrderMagicNumber ()!=magic_number)   continue ;         //Если Магик не наш - идем к следующему ордеру
         if ( OrderSymbol ()!=symbol_name)         continue ;         //Если Символ не наш - идем к следующему ордеру
         //--- покупки
         if ( OrderType ()== OP_BUY ) {
             int     digits=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
             double point=( SymbolInfoDouble (symbol_name, SYMBOL_POINT ));
             double pb= SymbolInfoDouble (symbol_name, SYMBOL_BID );
             double profit=pb- OrderOpenPrice ();                     // Профит позиции в цене (без комиссий и свопов)
             //--- безубыток
             if (use_breakeven) {
               //--- если профит в цене больше заданного
               if (profit>=profit_for_breakeven*point) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble ( OrderOpenPrice ()+breakeven_level*point,digits);
                   if (pb-lv*point>sl && OrderStopLoss ()<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) return ;
                  }
               }
             //--- трал
             if (use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if (profit>=trailing_start*point || trailing_start== EMPTY ) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble (level_of_trail-trailing_stop*point,digits);   // вычисляем новый уровень стоплосс по значению, переданному в функцию
                   //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                   if (pb-lv*point>sl && OrderStopLoss ()+trailing_step*point<sl) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) return ;
                  }
               }
            }

         //--- Продажи
         if ( OrderType ()== OP_SELL ) {
             int     digits=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
             double point=( SymbolInfoDouble (symbol_name, SYMBOL_POINT ));
             double pa= SymbolInfoDouble (symbol_name, SYMBOL_ASK );
             double profit= OrderOpenPrice ()-pa;                     // Профит позиции в цене (без комиссий и свопов)
             //--- безубыток
             if (use_breakeven) {
               //--- если профит в цене больше заданного
               if (profit>=profit_for_breakeven*point) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble ( OrderOpenPrice ()-breakeven_level*point,digits);
                   if (pa+lv*point<sl && ( OrderStopLoss ()>sl || OrderStopLoss ()== 0 )) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) break ;
                  }
               }
             //--- трал
             if (use_trail) {
               //--- если профит в пунктах больше заданного, или изначально задан меньше ноля
               if (profit>=trailing_start*point || trailing_start== EMPTY ) {
                   int err= ERR_NO_ERROR ;
                   double sl= NormalizeDouble (level_of_trail+trailing_stop*point,digits);   // вычисляем новый уровень стоплосс по значению, переданному в функцию
                   //--- Если новое значение СЛ не ближе Stop Level и если новое положение СЛ больше старого+шаг СЛ, то модифицируем стоп позиции
                   if (pa+lv*point<sl && ( OrderStopLoss ()-trailing_step*point>sl || OrderStopLoss ()== 0 )) {
                     // Сюда вписываем свою функцию модификации. Можно конечно и стандартной обойтись:
                     // OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),OrderExpiration(),clrModify); ...
                     // ... но в ней не предусмотрены проверки кодов возврата торгового сервера и их обработка
                     //ModifyOrder(-1,sl,-1,err);
                     }
                   if (err== ERR_MARKET_CLOSED ) break ;
                  }
               }
            }
         }
      }
}
//+------------------------------------------------------------------+
int StopLevel( string symbol_name) {
   int sp=( int ) SymbolInfoInteger (symbol_name, SYMBOL_SPREAD );
   int lv=( int ) SymbolInfoInteger (symbol_name, SYMBOL_TRADE_STOPS_LEVEL );
   return ((lv== 0 )?sp* 2 :lv);
   }
//+------------------------------------------------------------------+
Genel olarak, ezhli bir şey - sorun. veya doğru

Uzman Danışmanımı geliştirmeme yardım eder misin? Stopları koyan, ancak stop kayıplarının nasıl sürükleneceğini bilmeyen bir Uzman Danışmanım var. Bunu hiç anlamıyorum ve bir uzmanın yardımını umuyorum.

 

Bir dizi öğesinin ağırlığını belirlemek için bir işleve ihtiyacınız var. Belirli bir öğeye yakın olan (ve daha yakın olan) diğer öğelerin sayısı arttıkça, ağırlığı da artar. Belki böyle bir özellik zaten vardır. Bir numunedeki bir elementin ağırlığını, numunedeki elementlerin konsantrasyonuyla belirlemek gibi bir şey. Teşekkür ederim.

 

Merhaba! MQL4 test cihazında neden yalnızca bir yinelemenin geçtiğini ve sonra durduğunu anlayamıyorum ? TimeCurrent() güncellenmiyor mu? Nasıl güncellenir? Çoklu para birimi danışmanının kenelerle değil, her saniye veya saniyede 5 kez daha iyi çalışması gerekir.

   int start()                                     // Спец. функция start
  {
     while (! IsStopped ())
     {
       RefreshRates ();
       if ( RefreshRates ()== true ||MyTimer( 1 ))
        {
         код советника
        }  
     }
     return ( 0 );
  }


bool MyTimer( int Delay) //функция для работы советника по заданому интервалу времени, а не по тикам
{
   RefreshRates ();
   static datetime Time1, Time2;
   bool Result = False ;
  
   if ( MathMod ( TimeSeconds ( TimeCurrent ()), Delay) == 0.0 )
  {
    Time1 = TimeCurrent ();
     if (Time1 != Time2)
    {  
      Time2 = Time1;
      Result = True ;
    }
  }
   return (Result);
}
 
Jenya77769 :

Merhaba! MQL4 test cihazında neden yalnızca bir yinelemenin geçtiğini ve sonra durduğunu anlayamıyorum ? TimeCurrent() güncellenmiyor mu? Nasıl güncellenir? Çoklu para birimi danışmanının kenelerle değil, her saniye veya saniyede 5 kez daha iyi çalışması gerekir.

Danışman olarak bir şey mi başlatıyorsunuz? yani uzmanlar dizininden ??

Uzman Danışmanlar için start() işlevi (eski adı, modern OnTick) her tik üzerinde başlatılır, yani tik bittiğinde bitmesi gerekir. Ve sende var zatsiklina

 
Maxim Kuznetsov :

Danışman olarak bir şey mi başlatıyorsunuz? yani uzmanlar dizininden ??

Uzman Danışmanlar için start() işlevi (eski adı, modern OnTick) her tik üzerinde başlatılır, yani tik bittiğinde bitmesi gerekir. Ve sende var zatsiklina

Burada öğreticide buna izin verilir ve döngülü "start" işlevine sahip bir örnek vardır.

https://book.mql4.com/en/special/index

О сложных программах - Учебник по MQL4
О сложных программах - Учебник по MQL4
  • book.mql4.com
О сложных программах - Учебник по MQL4
 
Jenya77769 : Burada öğreticide buna izin verilir ve döngülü "start" işlevine sahip bir örnek vardır

Tabii ki döngü yapabilirsiniz. Ancak bir sonraki TIC tarafından bırakılması tavsiye edilir. Aksi takdirde, TIC kaybolacaktır. O gerekli mi?

 
LRA :

Tabii ki döngü yapabilirsiniz. Ancak bir sonraki TIC tarafından bırakılması tavsiye edilir. Aksi takdirde, TIC kaybolacaktır. O gerekli mi?


neden kayıp? RefreshRates () işlevi kullanılarak yeni bir onay işareti hakkında bilgi alınabilir; sonsuz döngüde

 
Jenya77769 : neden kaybetti? RefreshRates () işlevi kullanılarak yeni bir onay işareti hakkında bilgi alınabilir; sonsuz döngüde

Yeniler () işlevi sadece kontrol eder. Veriler güncellendiyse true değerini döndürür. Bunu while(! RefreshRates ()); - bekleyen kene

 
LRA :

Yeniler () işlevi sadece kontrol eder . Veriler güncellendiyse true değerini döndürür. Bunu while(! RefreshRates ()); - bekleyen kene

Güncellemeler (insanları kandırmayın) ve güncelleme için bir başarı veya başarısızlık bayrağı döndürür.

SymbolInfoDouble() , SymbolInfoTick() kullanarak veri alırsanız onsuz yapabilirsiniz.