Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1319

 
SanAlex :

Ben kendi kendimi yetiştirdim ve size açıklayamam - sadece ihtiyacım olan işlevleri seçtim, bunun aracılığıyla oradan oradan oradan biliyorum.

Temel olarak, Vladimir Karputov'un kodlarından tüm işlevleri çok teşekkür ederim!!! - herhangi bir sorunuz olursa size söyleyecektir.

Kendi kendini yetiştiriyorsun ama programlamaya yeni başladım ve kafamda sadece sorular var.  

Kafamda bu danışmanın algoritmasını hayal ediyorum ve bu süreçte göstergeyi değiştirmeniz gerekip gerekmediği bir soru değil - sonuçta, ondan sadece iki görev ihale ediliyor (yön tekerleği yukarı ve yön noktası aşağı).

Şu anda en basit olanın en iyisi olduğu klasiklerinden yola çıkıyorum. Bu yüzden şapeli sadeleştirmek ...... ve aynı zamanda yaratmak istediklerimden en iyi şekilde yararlanmak istiyorum. Algoritmam üzerinde birlikte çalışmayı öneriyorum - bence her ikisi için de ilginç olacak.
İlgileniyorsanız özelden yazın.
 
Vladimir Karputov :

Kalıtım, bir sınıf oluşturmak anlamına gelir.

Bu yüzden yazıyorum - bu yöntemleri standart kitaplıklarından kullanmak için sınıfınızı hangi sınıftan devralacaksınız?

 
SanAlex :

işte başka bir seçenek - alma nasıl çalıştı - aynı yönde tekrar açılacak

Oldukça doğru, bir karla !!!

İlk bakışta, her şey doğru.

Ve Zararı Durdur'un - aynı zamanda olmaması gerektiği - doğru.

Ama Kar Al ile kapatılmayan emrin nereye gittiğini anlamadım ....... fiyat hareketinin yönü değiştiğinde .... (sadece varsayılan olarak kapanır, yani. eğilim değişikliği göstergesi) ? Eğer öyleyse, bu benim fikrim değil.

Ve fikrime göre - sipariş kalmalı, ancak burada ayarlarıyla birlikte martin devreye girmeli:

 input group "======== МАРТИН ========" ; 
input int       MMType        = 1 ;         // 1 - вкл. , 2 - выкл.
input double    Multiplikator = 1.667 ;     // множитель следующего лота
input double    Step          = 150.0 ;     // Расстояние между ордерами

onlar. lotta bir artışla trendin tersi yönde sipariş verin ve kârın ortalamasını alın. Kısacası, basit bir Martin gibi çalışın - örneğin (Danışman Otomatik Kâr 3), İnternette açık kaynak olarak bulunur, ancak mql4 ile yazılır.

Bu arada, orijinal versiyon - doğru yazdığınız trende göre çalışın - Martin ile çalışırken kimse tarafından iptal edilmedi.

Kısacası, bir trendle çalışmak, kısmen ve zekice gösterdiğiniz bir görevdir ve ikinci görev martindir.

Bu iki görevin birbirine bağlı olması gerekli değildir - bence tamamen bağımsız çalışabilirler.

 
Sprut 185 :

Oldukça doğru, bir karla !!!

İlk bakışta, her şey doğru.

Ve Zararı Durdur'un - aynı zamanda olmaması gerektiği - doğru.

Ama Kar Al ile kapatılmayan emrin nereye gittiğini anlamadım .... fiyat hareketinin yönü değiştiğinde .... (sadece varsayılan olarak, yani trendin sinyali ile kapanır değişim göstergesi) ? Eğer öyleyse, bu benim fikrim değil.

Ve fikrime göre - sipariş kalmalı, ancak burada ayarlarıyla birlikte martin devreye girmeli:

onlar. lotta bir artışla trendin tersi yönde sipariş verin ve kârın ortalamasını alın. Kısacası, basit bir Martin gibi çalışın - örneğin (Danışman Otomatik Kâr 3), İnternette açık kaynak olarak bulunur, ancak mql4 ile yazılır.

Sadece bir not: bir "düzen" değil, bir "pozisyon".

 
Vladimir Karputov :

Sadece bir açıklama: bir "düzen" değil, bir "pozisyon".

Hata için özür dilerim.
Bunu dikkate alacağım ve gelecekte geliştirmeye çalışacağım.
 
Sprut 185 :

bulabildiğim tüm seçenekler - başka seçenek yok

4 Sürgün 185

 //+------------------------------------------------------------------+
//|                                                  4 Sprut 185.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"
//---
#define MACD_MAGIC 1234502
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
//---
double             m_adjusted_point;             // point value adjusted for 3 or 5 points
CTrade            m_trade;                       // trading object
CSymbolInfo       m_symbol;                     // symbol info object
CPositionInfo     m_position;                   // trade position object
CAccountInfo      m_account;                     // account info wrapper
//---
input double InpLots          = 0.1 ;   // Lots
input int     InpTakeProfit    = 50 ;     // Take Profit (in pips)
input bool    InpVariant       = false ; // Option
input int     InpBar           = 1 ;     // Bar
input bool    InpClOp          = false ; // Close opposite
//---
double m_macd_current;
double m_signal_current;
double m_take_profit;
int     price_uno;
int     m_handle_macd; // MACD indicator handle
int     ExtTimeOut= 10 ; // time out in seconds between trade operations
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- initialize common information
   m_symbol.Name( Symbol ());                   // symbol
   m_trade.SetExpertMagicNumber(MACD_MAGIC); // magic
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol( Symbol ());
//--- tuning for 3 or 5 digits
   int digits_adjust= 1 ;
   if (m_symbol. Digits ()== 3 || m_symbol. Digits ()== 5 )
      digits_adjust= 10 ;
   m_adjusted_point=m_symbol. Point ()*digits_adjust;
//--- set default deviation for trading in adjusted points
   m_take_profit     =InpTakeProfit*m_adjusted_point;
//--- set default deviation for trading in adjusted points
   m_trade.SetDeviationInPoints( 3 *digits_adjust);
//--- create StepMA_NRTR indicator
   m_handle_macd= iCustom ( NULL , 0 , "StepMA_NRTR" );
   if (m_handle_macd== INVALID_HANDLE )
     {
       printf ( "Error creating StepMA_NRTR indicator" );
       return ( false );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ( void )
  {
   static datetime limit_time= 0 ; // last trade processing time + timeout
//--- don't process if timeout
   if ( TimeCurrent ()>=limit_time)
     {
       //--- check for data
       if ( Bars ( Symbol (), Period ())> 2 )
        {
         //--- change limit time by timeout in seconds if processed
         if (!InpVariant && Processing())
            limit_time= TimeCurrent ()+ExtTimeOut;
         //--- change limit time by timeout in seconds if processed
         if (InpVariant && Processing_1())
            limit_time= TimeCurrent ()+ExtTimeOut;
        }
     }
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool Processing( void )
  {
//--- refresh rates
   if (!m_symbol.RefreshRates())
       return ( false );
   double m_buff_MACD_main[],m_buff_MACD_signal[];
   ArraySetAsSeries (m_buff_MACD_main, true );
   ArraySetAsSeries (m_buff_MACD_signal, true );
   int start_pos=InpBar,count= 3 ;
   if (!iGetArray(m_handle_macd, 0 ,start_pos,count,m_buff_MACD_main)||
      !iGetArray(m_handle_macd, 1 ,start_pos,count,m_buff_MACD_signal))
     {
       return ( false );
     }
//---
   m_macd_current   =m_buff_MACD_main[ 0 ];
   m_signal_current =m_buff_MACD_signal[ 0 ];
//---
   if (m_position.Select( Symbol ()))
     {
       //--- try to close or modify long position
       if (LongClosed())
         return ( true );
       //--- try to close or modify short position
       if (ShortClosed())
         return ( true );
     }
   else
     {
       //--- check for long position (BUY) possibility
       if (LongOpened())
         return ( true );
       //--- check for short position (SELL) possibility
       if (ShortOpened())
         return ( true );
     }
//--- exit without position processing
   return ( false );
  }
//+------------------------------------------------------------------+
//| main function returns true if any position processed             |
//+------------------------------------------------------------------+
bool Processing_1( void )
  {
//--- refresh rates
   if (!m_symbol.RefreshRates())
       return ( false );
   double m_buff_MACD_main[],m_buff_MACD_signal[];
   bool StNRUp,StNRDn;
   ArraySetAsSeries (m_buff_MACD_main, true );
   ArraySetAsSeries (m_buff_MACD_signal, true );
   int start_pos=InpBar,count= 3 ;
   if (!iGetArray(m_handle_macd, 0 ,start_pos,count,m_buff_MACD_main)||
      !iGetArray(m_handle_macd, 1 ,start_pos,count,m_buff_MACD_signal))
     {
       return ( false );
     }
//---
   m_macd_current   =m_buff_MACD_main[ 0 ];
   m_signal_current =m_buff_MACD_signal[ 0 ];
//---
   StNRUp=m_buff_MACD_main[ 0 ]<m_buff_MACD_signal[ 0 ];
   StNRDn=m_buff_MACD_main[ 0 ]>m_buff_MACD_signal[ 0 ];
//--- BUY Signal
   if (StNRUp)
     {
       if (InpClOp)
         if (ShortClosed())
             Sleep ( 1000 );
       if (price_uno< 0 )
         LongOpened();
      price_uno=+ 1 ;
       return ( true );
     }
//--- SELL Signal
   if (StNRDn)
     {
       if (InpClOp)
         if (LongClosed())
             Sleep ( 1000 );
       if (price_uno> 0 )
         ShortOpened();
      price_uno=- 1 ;
       return ( true );
     }
//--- exit without position processing
   return ( false );
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool LongClosed( void )
  {
   bool res= false ;
//--- should it be closed?
   if (m_macd_current>m_signal_current)
     {
       //--- close position
       if (InpClOp)
         ClosePositions( POSITION_TYPE_BUY );
       //--- processed and cannot be modified
      res= true ;
     }
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Check for short position closing                                 |
//+------------------------------------------------------------------+
bool ShortClosed( void )
  {
   bool res= false ;
//--- should it be closed?
   if (m_macd_current<m_signal_current)
     {
       //--- close position
       if (InpClOp)
         ClosePositions( POSITION_TYPE_SELL );
       //--- processed and cannot be modified
      res= true ;
     }
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Check for long position opening                                  |
//+------------------------------------------------------------------+
bool LongOpened( void )
  {
   bool res= false ;
//--- check for long position (BUY) possibility
   if (m_macd_current<m_signal_current)
     {
       double price=m_symbol.Ask();
       double tp   =m_symbol.Bid()+m_take_profit;
       //--- check for free money
       if (m_account.FreeMarginCheck( Symbol (), ORDER_TYPE_BUY ,InpLots,price)< 0.0 )
         printf ( "We have no money. Free Margin = %f" ,m_account.FreeMargin());
       else
        {
         //--- open position
         if (m_trade.PositionOpen( Symbol (), ORDER_TYPE_BUY ,InpLots,price, 0.0 ,tp))
             printf ( "Position by %s to be opened" , Symbol ());
         else
           {
             printf ( "Error opening BUY position by %s : '%s'" , Symbol (),m_trade.ResultComment());
             printf ( "Open parameters : price=%f,TP=%f" ,price,tp);
           }
         PlaySound ( "ok.wav" );
        }
       //--- in any case we must exit from expert
      res= true ;
     }
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Check for short position opening                                 |
//+------------------------------------------------------------------+
bool ShortOpened( void )
  {
   bool res= false ;
//--- check for short position (SELL) possibility
   if (m_macd_current>m_signal_current)
     {
       double price=m_symbol.Bid();
       double tp   =m_symbol.Ask()-m_take_profit;
       //--- check for free money
       if (m_account.FreeMarginCheck( Symbol (), ORDER_TYPE_SELL ,InpLots,price)< 0.0 )
         printf ( "We have no money. Free Margin = %f" ,m_account.FreeMargin());
       else
        {
         //--- open position
         if (m_trade.PositionOpen( Symbol (), ORDER_TYPE_SELL ,InpLots,price, 0.0 ,tp))
             printf ( "Position by %s to be opened" , Symbol ());
         else
           {
             printf ( "Error opening SELL position by %s : '%s'" , Symbol (),m_trade.ResultComment());
             printf ( "Open parameters : price=%f,TP=%f" ,price,tp);
           }
         PlaySound ( "ok.wav" );
        }
       //--- in any case we must exit from expert
      res= true ;
     }
//--- result
   return (res);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if (!m_symbol.RefreshRates())
     {
       return ( false );
     }
//--- protection against the return value of "zero"
   if (m_symbol.Ask()== 0 || m_symbol.Bid()== 0 )
     {
       return ( false );
     }
//---
   return ( true );
  }
//+------------------------------------------------------------------+
//| Check Freeze and Stops levels                                    |
//+------------------------------------------------------------------+
void FreezeStopsLevels( double &freeze, double &stops)
  {
//--- check Freeze and Stops levels
   double coeff=( double ) 1 ;
   if (!RefreshRates() || !m_symbol.Refresh())
       return ;
//--- FreezeLevel -> for pending order and modification
   double freeze_level=m_symbol.FreezeLevel()*m_symbol. Point ();
   if (freeze_level== 0.0 )
       if ( 1 > 0 )
         freeze_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//--- StopsLevel -> for TakeProfit and StopLoss
   double stop_level=m_symbol.StopsLevel()*m_symbol. Point ();
   if (stop_level== 0.0 )
       if ( 1 > 0 )
         stop_level=(m_symbol.Ask()-m_symbol.Bid())*coeff;
//---
   freeze=freeze_level;
   stops=stop_level;
//---
   return ;
  }
//+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions( const ENUM_POSITION_TYPE pos_type)
  {
   double freeze= 0.0 ,stops= 0.0 ;
   FreezeStopsLevels(freeze,stops);
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of current positions
       if (m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if (m_position. Symbol ()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
             if (m_position.PositionType()==pos_type)
              {
               if (m_position.PositionType()== POSITION_TYPE_BUY )
                 {
                   bool take_profit_level=((m_position.TakeProfit()!= 0.0 && m_position.TakeProfit()-m_position.PriceCurrent()>=freeze) || m_position.TakeProfit()== 0.0 );
                   bool stop_loss_level=((m_position.StopLoss()!= 0.0 && m_position.PriceCurrent()-m_position.StopLoss()>=freeze) || m_position.StopLoss()== 0.0 );
                   if (take_profit_level && stop_loss_level)
                     if (!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbol
                         Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "BUY PositionClose " ,m_position.Ticket(), ", " ,m_trade.ResultRetcodeDescription());
                 }
               if (m_position.PositionType()== POSITION_TYPE_SELL )
                 {
                   bool take_profit_level=((m_position.TakeProfit()!= 0.0 && m_position.PriceCurrent()-m_position.TakeProfit()>=freeze) || m_position.TakeProfit()== 0.0 );
                   bool stop_loss_level=((m_position.StopLoss()!= 0.0 && m_position.StopLoss()-m_position.PriceCurrent()>=freeze) || m_position.StopLoss()== 0.0 );
                   if (take_profit_level && stop_loss_level)
                     if (!m_trade.PositionClose(m_position.Ticket())) // close a position by the specified m_symbol
                         Print ( __FILE__ , " " , __FUNCTION__ , ", ERROR: " , "SELL PositionClose " ,m_position.Ticket(), ", " ,m_trade.ResultRetcodeDescription());
                 }
               PlaySound ( "ok.wav" );
              }
  }
//+------------------------------------------------------------------+
//| Filling the indicator buffers from the indicator                 |
//+------------------------------------------------------------------+
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))
     {
       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)
     {
       return ( false );
     }
   return (result);
  }
//+------------------------------------------------------------------+
 
SanAlex :

bulabildiğim tüm seçenekler - başka seçenek yok


EA'da 2 bağımsız blok kullanmaya çalışırsak ne olur? Daha sonra, zaten trend üzerinde çalıştığınız için (göstergeyi kullanarak) kişi kendi başına çalışacaktır (göstergeyi kullanarak)..........
Ve ikincisi , ilk blok tarafından ayarlanan sinyale göre - konuma göre - trende göre değil ........


Zaten yukarıda yazdım:

Bu iki görevin birbirine bağlı olması gerekli değildir - bence tamamen bağımsız çalışabilirler .

Önerdiğim böyle bir algoritma - (bence) henüz programcılar tarafından kullanılmadı. Her durumda, böyle bir çözüm bulamadım - İnternette.

 
Sprut 185 : Önerdiğim böyle bir algoritma - (bence) henüz programcılar tarafından kullanılmadı. Her durumda, böyle bir çözüm bulamadım - İnternette.

büyük olasılıkla uygulamak mümkün değil

bu işe yaramaz - sembol üzerinde bir pozisyon olmalıdır (bu, pozisyon kapatılıp kâr için yeniden açıldıysa) (ve ters sinyal verildiğinde, diğer yönde açılamaz

   if (m_position.Select( Symbol ()))

sadece bir sinyalden (bir noktadan) geliyorsa, o zaman sorun yok. (ve sonra, bu kodda bulunmamalıdır (yukarıdaki satır)))

 
SanAlex :

büyük olasılıkla uygulamak mümkün değil

bu işe yaramaz - sembol üzerinde bir pozisyon olmalıdır (bu, pozisyon kapatılıp kâr için yeniden açıldıysa) (ve ters sinyal verildiğinde, diğer yönde açılamaz

sadece bir sinyalden (bir noktadan) geliyorsa, o zaman sorun yok. (ve sonra, bu kodda bulunmamalıdır (yukarıdaki satır)))

Anlaşıldı - muhtemelen bu yüzden internette böyle bir çözüm bulamadım. Ama bence, bu sorunun çözümü - olmalıdır.
Teşekkürler - Bu soruna bir çözüm arayacağım .....
O zaman biraz ara verelim.
 

2981 sürümüne güncelledikten sonra satırda bir hata görünmeye başladı

 MqlTradeRequest request = { 0 }
cannot convert 0 to enum 'ENUM_TRADE_REQUEST_ACTIONS'   OrderaiPosicii.mqh      11      34
Lütfen bana bu satırı nasıl değiştireceğimi söyle.