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

 
MakarFX :

Bunu dene, çalışması gerekir

Hayır. sürekli bip uyarısı verir. İşte tüm kod ve hindiler. belki yanlış bir şey yapıyorum

 //+------------------------------------------------------------------+
//|                                                          777.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link        " https://www.mql5.com "
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot Покупаем
#property indicator_label1    "Продаём"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- plot Продаём
#property indicator_label2    "Покупаем"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrBlue
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1
//--- input parameters
double       Buy[];             // Буфер для покупок
double       Sell[];           // Буфер для продаж


int OnInit ()
  {
//--- indicator buffers mapping
     SetIndexBuffer ( 0 ,Buy);
   SetIndexBuffer ( 1 ,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue ( 0 , 0 );
   SetIndexEmptyValue ( 1 , 0 );
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle ( 0 , DRAW_ARROW );
   SetIndexStyle ( 1 , DRAW_ARROW ); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow( 0 , 234 );   //Стрелка "вниз" для продаж
   SetIndexArrow( 1 , 233 );   //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel( 0 , "Продаём" );
   SetIndexLabel( 1 , "Покупаем" );
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits ( Digits );
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ( "Мой первый индикатор" );
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
 

     int limit=rates_total-prev_calculated- 2 ;
   if (limit< 1 ) return ( 0 );
   for ( int i=limit;i>= 0 ;i--)
     {
     
       // Снимем показания индикатора
     double in1b = iCustom ( NULL , 0 , "in1" , 1 ,i+ 1 ); // индикатор 1 стрелка вверх
     double in1s = iCustom ( NULL , 0 , "in1" , 0 ,i+ 1 ); // индикатор 1 стрелка вниз
      
     
     
     double in2b = iCustom ( NULL , 0 , "in2" , 0 ,i+ 1 ); // индикатор 2 стрелка вверх
     double in2s = iCustom ( NULL , 0 , "in2" , 1 ,i+ 1 ); // индикатор 2 стрелка вниз
    
     Comment ( "in1v = " + DoubleToString (in1b)+ "\n" + "in1n = " + DoubleToString (in1s)+ "\n"
    + "in2v = " + DoubleToString (in2b)+ "\n" + "in2n = " + DoubleToString (in2s));
     
     if (in1b < 2147483647 && in2b < 2147483647 ) // индикатор стрелка вверх
        {
         Sell[i]=low[i];
       /*  if(show_alert!=time[i])
           {
            Alert(Symbol()+"BUY М "); show_alert=time[i];
           }*/
        }
   
       if (in1s < 2147483647 && in2s < 2147483647 ) // индикатор стрелка вниз
        {
         Buy[i]=high[i];
         /* if(show_alert!=time[i])
           {
            Alert(Symbol()+"SELL М "); show_alert=time[i];
           }*/
        }
     }
     
   
     
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
Dosyalar:
in1.ex4  13 kb
in2.ex4  28 kb
 
jarikn :
Beyler, göstergeye bir uyarı yapmama yardım edin. Farklı göstergelerin bir kombinasyonunu test etmek istiyorum, ancak bir uyarı işlevine ihtiyacım var. Ok göründüğünde uyarının sadece 1 kez gösterilmesi gerekir . Sizin için zor değilse, o zaman böyle bir fonksiyon yazmama yardım edin, aksi halde benim için çalışmıyor, MT4'ün donması kadar bir dakika boyunca veya her zaman bir uyarı çıkıyor.


Değişken ekle

sinyal değilse değişken yanlış olur

if (sinyal ve değişken== yanlış ) {

uyarmak;

değişken=doğru;

}

 
Andrey Sokolov :


Değişken ekle

yeni bir mum belirirse değişken yanlış olur

if (sinyal ve değişken== yanlış ) {

uyarmak;

değişken=doğru;

}

mum başına 1'den fazla olmayacak

TAMAM. Teşekkür ederim

 
jarikn :

TAMAM. Teşekkür ederim

orada değiştim

 
Bir soru daha. Bu gösterge neden işlemciyi yoğun bir şekilde yüklüyor? 10 döviz çifti açarsınız ve MT4'ün nasıl askıda kaldığını gösterirsiniz. bir şekilde düzeltebilir miyim? Ve bunu bir gösterge olarak değil de bir danışman olarak yaparsanız, bu şekilde de yavaşlar mı?
 
Lütfen bana bir nesneyi programlı olarak nasıl seçeceğimi söyler misiniz? Yardımda benzer bir şey bulamadım
 

Merhaba! Bir gösterge var - trendin açısını derece cinsinden gösterir (yine de normalleştirilmemiştir). Tabloda her şey harika. En azından açının tam eğrisinde (mavi), en azından ortasındaki (yeşil) - Şekil 1. Ancak gösterge, double Custom = iCustom(Symbol(), window, "Angle" aracılığıyla danışmana çağrıldığında ) , 0, 1), saçmalık üretir - bazı büyük sayılar - Şekil 2. Burada pencere grafik periyodudur, "Açı" göstergenin adıdır, 0 mavi çizginin hesaplandığı sıfır arabelleğidir (koyabilirsiniz) 1 - yeşil MA arabelleği, ancak sonuç benzer olacaktır), 1 - vardiya. Sorun ne olabilir?

Resim 1

şekil 2

 
Tango_X :
Lütfen bana bir nesneyi programlı olarak nasıl seçeceğimi söyler misiniz? Yardımda benzer bir şey bulamadım

OBJPROP_SELECTED

nesne seçimi

mql5

mql4

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Свойства объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Bir danışman yazdım , her şey çalışıyor gibi görünüyor. Ancak gerçek şu ki, siparişler hareketli ortalamaların kesiştiği noktada kapatılmalıdır. Ama kapanmazlar veya daha doğrusu, yalnızca ilk sıra kapanır ve hangi yönde olduğu önemli değildir ve daha sonra günlükte bir hata verir - OrderClose hatası 4051. Sorun nedir?
   //-----------------------------------------------------------
     if (CountSell() == 0 && mama1<mama2 && cci>verh && cci1>verh && cci<cci1)
      {
      tiket = OrderSend ( Symbol (), OP_SELL,Lots,Bid,Slippage, 0 , 0 , "" ,Magic, 0 , Red);
       if (tiket> 0 )
         {
         SL= NormalizeDouble (Bid+StopLoss* Point , Digits );
         TP= NormalizeDouble (Bid-TakeProfit* Point , Digits );
         if ( OrderSelect (tiket, SELECT_BY_TICKET))
             if (!OrderModify(tiket,OrderOpenPrice(),SL,TP, 0 ))
               Print ( "Ошибка модификации ордера на продажу" );
         } else Print ( "Ошибка открытия ордера на продажу" );
      }
     if (CountBuy() == 0 && mama1>mama2 && cci<nuz && cci1<nuz && cci>cci1)
      {
      tiket = OrderSend ( Symbol (), OP_BUY,Lots,Ask,Slippage, 0 , 0 , "" ,Magic, 0 ,Blue);
       if (tiket> 0 )
         {
         SL= NormalizeDouble (Ask-StopLoss* Point , Digits );
         TP= NormalizeDouble (Ask+TakeProfit* Point , Digits );
         if ( OrderSelect (tiket, SELECT_BY_TICKET))
           if (!OrderModify(tiket,OrderOpenPrice(),SL,TP, 0 ))
           Print ( "Ошибка модификации ордера на покупку" );
         } else Print ( "Ошибка открытия ордера на покупку" );
      }  
      
       if (mama1>mama2 && CountSell()> 0 )
      {
         for ( int i = OrdersTotal () - 1 ;i>= 0 ; i--)
         {
         if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
            {
             if (OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            OrderClose(OrderType(),OrderLots(),Ask,Slippage,Black);
            }
         }
         
      }
       if (mama1<mama2 && CountBuy()> 0 )
      {
         for ( int i = OrdersTotal () - 1 ;i>= 0 ; i--)
         {
         if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
            {
             if (OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            OrderClose(OrderType(),OrderLots(),Bid,Slippage,Black);
            }
         }
         
      }
 
Tango_X :
Lütfen bana bir nesneyi programlı olarak nasıl seçeceğimi söyler misiniz? Yardımda benzer bir şey bulamadım

Standart nesne oluşturma işlevini kullanırsanız, varsayılan parametrelerde seçim = true olur. Örneğin, bir trend çizgisi için alttan 4. çizgi:

 bool TrendCreate( const long             chart_ID = 0 ,       // ID графика
                 const string           name = "TrendLine" , // имя линии
                 const int              sub_window = 0 ,     // номер подокна
                 datetime               time1 = 0 ,         // время первой точки
                 double                 price1 = 0 ,         // цена первой точки
                 datetime               time2 = 0 ,         // время второй точки
                 double                 price2 = 0 ,         // цена второй точки
                 const color            clr = clrRed ,       // цвет линии
                 const ENUM_LINE_STYLE style = STYLE_SOLID , // стиль линии
                 const int              width = 4 ,         // толщина линии
                 const bool             back = false ,       // на заднем плане
                 const bool             selection = true , // выделить для перемещений
                 const bool             ray_right = false , // продолжение линии вправо
                 const bool             hidden = true ,     // скрыт в списке объектов
                 const long             z_order = 0 )       // приоритет на нажатие мышью