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

 
Alexandr Sokolov :

Teşekkür ederim! Peki ya ticari amaçlıysa?

anlamda piyasa için?

o zaman kendin için GUI kitaplığını görüntü ve benzerlikte canavarlaştırmak için :-(

Mevcut olanlar kendi yollarında yetersizler.Eh, MQL karmaşık GUI'ler için tasarlanmamıştır. Onun işi saymak ve ticaret yapmaktır, bunun için hapsedilmiştir.

Yani, yapılabilir, ancak acı verici bir şekilde aptalca.

 

CCanvas kütüphanesini incelemeye karar verdim


Anlayamıyorum - hata yok (daha doğrusu derleyici bunları yayınlamıyor) ve ekranda da hiçbir şey yok. Kırmızı bir üçgen çizmek istiyorum...

 #include <Canvas\Canvas.mqh>

#property copyright "Alexandr Sokolov"
#property link        "https://www.mql5.com/en/users/asokolov7"
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots    0
CCanvas canvas;
//-------------------------------------------------------------------------------------------------
int OnInit ()
  {
   bool a = canvas.Create( "a" , 600 , 400 , 0 );
   canvas.FillTriangle( 100 , 100 , 80 , 120 , 120 , 120 , clrRed );
   canvas.Update( true ); Alert (a);
   return ( INIT_SUCCEEDED );
  }
//-------------------------------------------------------------------------------------------------
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[])
  {
   
   return (rates_total);
  }


Ve işte sonunda ne var


 
Alexandr Sokolov :

CCanvas kütüphanesini incelemeye karar verdim

 #property copyright "IgorM"
#property link        "https://www.mql5.com/ru/users/igorm"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots 0

#include <Canvas\Canvas.mqh>

CCanvas canvas;
int xtr[ 3 ] = { 2 , 100 , 198 };
int ytr[ 3 ] = { 198 , 2 , 198 };
const uint clrtr = ColorToARGB ( clrRed );

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{
   if (!canvas.CreateBitmapLabel( 0 , 0 , "canvasname" , 10 , 10 , 200 , 200 )) return ( INIT_FAILED );
   canvas.Erase();
   canvas.FillTriangle(xtr[ 0 ], ytr[ 0 ], xtr[ 1 ], ytr[ 1 ], xtr[ 2 ], ytr[ 2 ], clrtr);
   canvas.Update();
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   canvas.Destroy();
}
//+------------------------------------------------------------------+
//| 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[])
{
//---

//--- return value of prev_calculated for next call
   return (rates_total);
}
//+------------------------------------------------------------------+
 
Igor Makanu :

Bitmiş örnek için teşekkürler.

Zor değilse, hatalarım hakkında birkaç söz söyleyebilir miyim? Sitedeki yardıma az önce baktım ve belgeler yalnızca işlevlerin kendi açıklamalarını içeriyor ve aşağıda hangi işlevin ardından hangi örnek var?

 
Alexandr Sokolov :

Bitmiş örnek için teşekkürler.

Zor değilse, hatalarım hakkında birkaç söz söyleyebilir miyim? Sitedeki yardıma az önce baktım ve belgeler yalnızca işlevlerin kendi açıklamalarını içeriyor ve aşağıda hangi işlevin ardından hangi örnek var?

makaleleri okuyun, birçok hazır örnek var https://www.mql5.com/en/search#!keyword=Canvas&module=mql5_module_articles

 

Tünaydın!!!

Kâr, lot ve bilet bazında kârsız emirleri ezberlemek için bir fonksiyon yazmaya çalışmak istiyorum.
Daha önce dizilerle çalışmadım, modele ve referanslara göre yaptım.

Dizinin boyutunun nerede ve nasıl belirleneceği açık değildir.

Bakalım düzeltebilecek misin?

======

yapı YapıSipariş

{

çift OrProf;

çift OrLot;

int OrTiK;

};

StructOrderOrSatın Al[];

StructOrderOrSell[];

====

geçersiz Cloce_No_FreeMargin()

{

çift kar_SELL = 0;

çift kar_BUY = 0;

double no_profits_BUY = 0;

double no_profits_SELL = 0;

double cur_profits_SELL = 0;

double cur_profits_BUY = 0;

//---

int bo = 0;

int yani = 0;

InitStruct_Order(OrSatın Al);

InitStruct_Order(OrSell);

//ArrayResize(OrSatın al,bo);

//ArrayResize(VeyaSat, yani);

for(int ticaret= OrdersTotal()-1; ticaret>= 0; ticaret--)

{

if(OrderSelect(ticaret,SELECT_BY_POS,MODE_TRADES)==yanlış)

kırmak;

if(OrderSymbol()==Symbol() && OrderMagicNumber()==sihir)

{

if(OrderType()==OP_SEL)

{

profit_SELL+=OrderProfit()+OrderSwap()+OrderCommission();

}

if(OrderType()==OP_BUY)

{

profit_BUY+=OrderProfit()+OrderSwap()+OrderCommission();

}

//============================================== ==========

if(OrderType()==OP_SEL)

{

cur_profits_SELL=OrderProfit()+OrderSwap()+OrderCommission();

if(cur_profits_SELL<0)

{

no_profits_SELL+=cur_profits_SELL;

OrSell[so].OrProf = OrderProfit()-OrderSwap()-OrderCommission();

OrSell[so].OrLot = OrderLots();

OrSell[so].OrTiK = OrderTicket();

yani++;

Print(" SATIŞ tipi: Kâr - ",VeyaSatın[bo].OrProf,": Parti - ",VeyaSatın[bo].VeyaLot,": Bilet - ",VeyaSatın[bo].OrTiK);

}

}

//============================================== ==========

if(OrderType()==OP_BUY)

{

cur_profits_BUY=OrderProfit()+OrderSwap()+OrderCommission();

if(cur_profits_BUY<0)

{

no_profits_BUY+=cur_profits_BUY;

OrBuy[bo].OrProf = OrderProfit()-OrderSwap()-OrderCommission();

OrBuy[bo].OrLot = OrderLots();

OrBuy[bo].OrTiK = OrderTicket();

bo++;

Print(" SATIN AL tipi: Kâr - ",VeyaSatın[bo].OrProf,": Parti - ",VeyaSatın[bo].VeyaLot,": Bilet - ",VeyaSatın[bo].OrTiK);

}

}

}

}

}

//+------------------------------------------- --------------------+

//| Siparişler için Başlangıç Yapısı |

//+------------------------------------------- --------------------+

geçersiz InitStruct_Order(StructOrder &Masiv[])

{

int Boyut = ArrayRange(Masiv,0);


for(int i=0; i<Boyut; i++)

{

Masiv[i].OrProf = 0;

Masiv[i].OrLot = 0;

Masiv[i].OrTiK = 0;

}

}

 

Hey,

Söyleyin lütfen, bir mq4 dosyası ve birçok mqh dosyasından oluşan bir projeyi piyasa için bir projede nasıl bir araya getiririm?

 

Arkadaşlar, bir satırdan oluşan, ancak alım ve satım için farklı renklerde olan göstergenin tersine çevrilmesini iCustom aracılığıyla Expert Advisor'da programlamama yardım edin. Onun oku yok. Bir renk için üç arabellek vardır, ancak aslında, fare ile gezinirken her iki renk için yalnızca bir Değer1 değeri gösterir. Çubukları karşılaştırmaya ve sıfırla karşılaştırmaya çalıştım, yardımcı olmuyor. Bu tür göstergelerin tersine çevrilmesi nasıl programlanır, kim bilir? İşte hindinin tamponlarının başlangıç ayarları ve resmi. StepMA'ya benziyor ama o değil:

 #property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 DodgerBlue
#property indicator_color2 Tomato
#property indicator_color3 Tomato
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
//----
extern int     Range           = 9 ;
extern int     FastMA          = 3 ;
extern int     SlowMA          = 30 ;
extern int     filter          = 25 ;
extern int     normalizeDigits = 4 ;

extern bool    alertsOn        = false ;
extern bool    alertsOnCurrent = false ;
extern bool    alertsMessage   = true ;
extern bool    alertsSound     = true ;
extern bool    alertsEmail     = false ;
extern string soundfile       = "alert2.wav" ;


double Downa[];
double Downb[];
double trend[];
double fAMA[];
double mAMA[];
double AMA[];

//------------------------------------------------------------------
//
//------------------------------------------------------------------

int init()
  {
   for ( int i= 0 ; i< indicator_buffers ; i++) SetIndexStyle(i, DRAW_LINE );
   IndicatorBuffers( 6 );
   SetIndexBuffer ( 0 , fAMA); 
   SetIndexBuffer ( 1 , Downa); 
   SetIndexBuffer ( 2 , Downb); 
   SetIndexBuffer ( 3 , trend); 
   SetIndexBuffer ( 4 , mAMA);
   SetIndexBuffer ( 5 , AMA);
   return ( 0 );
}
int deinit()
{
   return ( 0 );
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------


int start()
{
   int counted_bars = IndicatorCounted(); 
       if (counted_bars < 0 ) return (- 1 ); 
       if (counted_bars > 0 ) counted_bars--;  
         int limit= MathMin ( Bars -counted_bars, Bars - 1 );
         if (trend[limit] == - 1 ) ClearPoint(limit,Downa,Downb);

 
   
   double k1 = 2.0 / (SlowMA + 1 );
   double k2 = 2.0 / (FastMA + 1 ) - k1;
   for ( int i = limit; i>= 0 ; i--)
   {
       double sdAMA = 0 ;
       double Noise = 0 ; for ( int k= 0 ; k<Range; k++) Noise += MathAbs (Close[i+k] - Close[i+k+ 1 ]);
       double ER    = 0 ; if (Noise != 0 ) ER = MathAbs (Close[i] - Close[i+Range]) / Noise;
       double SSC   = (ER*k2+k1);
 
     
      
      AMA[i]  = AMA[i+ 1 ] + NormalizeDouble (SSC*SSC*(Close[i] - AMA[i+ 1 ]), normalizeDigits);
      mAMA[i] = AMA[i];
 
         if (filter < 1 ) fAMA[i] = mAMA[i];
         else
         {
             for (k = i; k <= i + SlowMA - 1 ; k++)  sdAMA = sdAMA + MathAbs (mAMA[k] - mAMA[k+ 1 ]);
               double dAMA  = mAMA[i] - mAMA[i+ 1 ];
               if (dAMA >= 0 )
                   if (dAMA < NormalizeDouble (filter*sdAMA/( 100 *SlowMA), 4 ) &&  High[i] <= High[Highest( NULL , 0 , MODE_HIGH , 4 , i)]+ 10 * Point )
                         fAMA[i] = fAMA[i+ 1 ];
                   else    fAMA[i] = mAMA[i];
               else
                   if ( MathAbs (dAMA) < NormalizeDouble (filter*sdAMA/( 100 *SlowMA), 4 ) && Low[i] > Low[Lowest( NULL , 0 , MODE_LOW , 4 , i)]- 10 * Point )
                        fAMA[i] = fAMA[i+ 1 ];
                   else   fAMA[i] = mAMA[i];
         }
       
      Downa[i] = EMPTY_VALUE ;
      Downb[i] = EMPTY_VALUE ;
      trend[i] = trend[i+ 1 ];
         if (fAMA[i]> fAMA[i+ 1 ]) trend[i] = 1 ;
         if (fAMA[i]< fAMA[i+ 1 ]) trend[i] =- 1 ;
         if (trend[i]==- 1 ) PlotPoint(i,Downa,Downb,fAMA);
   }
    
   //
  
      
   if (alertsOn)
   {
       if (alertsOnCurrent)
           int whichBar = 0 ;
       else      whichBar = 1 ;
       if (trend[whichBar] != trend[whichBar+ 1 ])
       if (trend[whichBar] == 1 )
            doAlert( "buy" );
       else   doAlert( "sell" );       
   }
   return ( 0 );
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
//


void doAlert( string doWhat)
{
   static string    previousAlert= "nothing" ;
   static datetime previousTime;
   string message;
   
       if (previousAlert != doWhat || previousTime != Time[ 0 ]) {
          previousAlert  = doWhat;
          previousTime   = Time[ 0 ];

           //
           //
          

          message =   StringConcatenate ( Symbol (), " at " ,TimeToStr( TimeLocal (), TIME_SECONDS ), " AMA STL_Color " ,doWhat);
             if (alertsMessage) Alert (message);
             if (alertsEmail)   SendMail ( StringConcatenate ( Symbol (), " AMA STL_Color " ),message);
             if (alertsSound)   PlaySound (soundfile);
      }
}
      
//------------------------------------------------------------------
//
//------------------------------------------------------------------


void ClearPoint( int i, double & first[], double & second[])
{
   if ((second[i]  != EMPTY_VALUE ) && (second[i+ 1 ] != EMPTY_VALUE ))
        second[i+ 1 ] = EMPTY_VALUE ;
   else
       if ((first[i] != EMPTY_VALUE ) && (first[i+ 1 ] != EMPTY_VALUE ) && (first[i+ 2 ] == EMPTY_VALUE ))
          first[i+ 1 ] = EMPTY_VALUE ;
}
void PlotPoint( int i, double & first[], double & second[], double & from[])
{
   if (first[i+ 1 ] == EMPTY_VALUE )
       if (first[i+ 2 ] == EMPTY_VALUE ) 
            { first[i]  = from[i]; first[i+ 1 ]  = from[i+ 1 ]; second[i] = EMPTY_VALUE ; }
       else   { second[i] = from[i]; second[i+ 1 ] = from[i+ 1 ]; first[i]  = EMPTY_VALUE ; }
   else      { first[i]  = from[i]; second[i]   = EMPTY_VALUE ; }
} 

 
zig2003 :

Arkadaşlar, bir satırdan oluşan, ancak alım ve satım için farklı renklerde olan göstergenin tersine çevrilmesini iCustom aracılığıyla Expert Advisor'da programlamama yardım edin. Onun oku yok. Renk için üç arabellek vardır, ancak aslında fare ile gezinirken her iki renk için yalnızca bir Değer1 değeri gösterir. Çubukları karşılaştırmaya ve sıfırla karşılaştırmaya çalıştım, yardımcı olmuyor. Bu tür göstergelerin tersine çevrilmesi nasıl programlanır, kim bilir? İşte hindinin tamponlarının başlangıç ayarları ve resmi. StepMA'ya benziyor ama o değil:


Kodu yapıştırın , lütfen düğmeyi kullanarak &quot;MQL5 kodunu girin&quot; düğmesi

 
zig2003 :

Arkadaşlar, bir satırdan oluşan, ancak alım ve satım için farklı renklerde olan göstergenin tersine çevrilmesini iCustom aracılığıyla Expert Advisor'da programlamama yardım edin. Onun oku yok. Bir renk için üç arabellek vardır, ancak aslında, fare ile gezinirken her iki renk için yalnızca bir Değer1 değeri gösterir. Çubukları karşılaştırmaya ve sıfırla karşılaştırmaya çalıştım, yardımcı olmuyor. Bu tür göstergelerin tersine çevrilmesi nasıl programlanır, kim bilir? İşte hindinin tamponlarının başlangıç ayarları ve resmi. StepMA'ya benziyor ama o değil:


Misal

DRAW_COLOR_LINE Basit Kullanım Örneği

DRAW_COLOR_LINE'a dayalı gösterge. İki gösterge arabelleği - biri değerler için (' ColorLineBuffer ') ve biri renkler için (' ColorLineColors ').

 //+------------------------------------------------------------------+ 
//|                                         DRAW_COLOR_LINE Lite.mq5 | 
//|                        Copyright 2016, MetaQuotes Software Corp. | 
//|                                             https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link        "https://www.mql5.com" 
#property version    "1.00" 

#property description "An indicator to demonstrate DRAW_COLOR_LINE" 
#property description "It draws a line on Close price in colored pieces of 20 bars each" 
#property description "The width, style and color of the line parts are changed randomly" 
#property description "every N ticks" 

#property indicator_chart_window 
#property indicator_buffers 2 
#property indicator_plots    1 
//--- plot ColorLine 
#property indicator_label1    "ColorLine" 
#property indicator_type1    DRAW_COLOR_LINE 
//--- Define 5 colors for coloring each bar (they are stored in the special array) 
#property indicator_color1    clrBlue , clrRed // (Up to 64 colors can be specified) 
#property indicator_style1    STYLE_SOLID 
#property indicator_width1    3 
//--- A buffer for plotting 
double          ColorLineBuffer[];
//--- A buffer for storing the line color on each bar 
double          ColorLineColors[];
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit ()
  {
//--- Binding an array and an indicator buffer 
   SetIndexBuffer ( 0 ,ColorLineBuffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,ColorLineColors, INDICATOR_COLOR_INDEX );
//---
   ArraySetAsSeries (ColorLineBuffer, true );
   ArraySetAsSeries (ColorLineColors, true );
//--- 
   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[])
  {
   ArraySetAsSeries (close, true );
   if (prev_calculated== 0 )
     {
       for ( int i= 0 ;i<rates_total;i++)
         ColorLineBuffer[i]=close[i];
     }
//--- Block for calculating indicator values 
   for ( int i= 0 ;i< 10 ;i++)
     {
       //--- Write the indicator value into the buffer 
      ColorLineBuffer[i]=close[i];
       //--- For this bar, the line will have the color with the index color_index 
       if (ColorLineBuffer[i]>ColorLineBuffer[i+ 1 ])
         ColorLineColors[i]= 0 ;
       else
         ColorLineColors[i]= 1 ;
     }

//--- Return the prev_calculated value for the next call of the function 
   return (rates_total);
  }
//+------------------------------------------------------------------+


Ve EA, '0' (' ColorLineBuffer ') ve '1' (' ColorLineColors ') arabelleğindeki değerleri kopyalar.

 //+------------------------------------------------------------------+
//|                                 DRAW_COLOR_LINE Lite Example.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//---
int     handle_iCustom;                       // variable for storing the handle of the iCustom indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
//--- create handle of the indicator iCustom
   handle_iCustom= iCustom ( Symbol (), Period (), "DRAW_COLOR_LINE Lite" );
//--- if the handle is not created
   if (handle_iCustom== INVALID_HANDLE )
     {
       //--- tell about the failure and output the error code
       PrintFormat ( "Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d" ,
                   Symbol (),
                   EnumToString ( Period ()),
                   GetLastError ());
       //--- the indicator is stopped early
       return ( INIT_FAILED );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   double array_value[],array_color[];
   ArraySetAsSeries (array_value, true );
   ArraySetAsSeries (array_color, true );
   int start_pos= 0 ,count= 1 ;
   if (!iGetArray(handle_iCustom, 0 ,start_pos,count,array_value) ||
      !iGetArray(handle_iCustom, 1 ,start_pos,count,array_color))
     {
       return ;
     }
//---
   string text= "Value: " + DoubleToString (array_value[ 0 ], 8 )+ ", color: " + DoubleToString (array_color[ 0 ], 8 );
   Comment (text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray( const int handle, const int buffer, const int start_pos,
               const int count, double &arr_buffer[])
  {
   bool result= true ;
   if (! ArrayIsDynamic (arr_buffer))
     {
       PrintFormat ( "ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!" , __FILE__ , __FUNCTION__ );
       return ( false );
     }
   ArrayFree (arr_buffer);
//--- reset error code
   ResetLastError ();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied= CopyBuffer (handle,buffer,start_pos,count,arr_buffer);
   if (copied!=count)
     {
       //--- if the copying fails, tell the error code
       PrintFormat ( "ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d" ,
                   __FILE__ , __FUNCTION__ ,count,copied, GetLastError ());
       //--- quit with zero result - it means that the indicator is considered as not calculated
       return ( false );
     }
   return (result);
  }
//+------------------------------------------------------------------+
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • www.mql5.com
В своей статье  я сделал достаточно убедительные тесты, доказывающие тот факт, что далеко не каждый вызов пользовательского или даже технического индикатора в коде - это самый оптимальный вариант для обработки им промежуточных расчетов в разрабатываемом индикаторе. Итоговый результат по скорости своего исполнения может оказаться значительно...