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

 
Aleksandr Egorov :
Her bir çift için ayrı ayrı MT5'te açık siparişler için komisyon nasıl hesaplanır? çözümü olan var mı

nedense istemiyor - sıfırlar gösteriyor

 //+------------------------------------------------------------------+
//|                                                   Commission.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"
#include <Trade\PositionInfo.mqh>
CPositionInfo     m_position;             // : trade position object
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   double Commission= 0.00 ;
   int total= PositionsTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       string    position_GetSymbol= PositionGetSymbol (i); //
       if (position_GetSymbol== Symbol ())
        {
         Commission=Commission+m_position.Commission();
        }
     }
   string msg= DoubleToString (Commission, 2 );
   Print (msg);
  }
//+------------------------------------------------------------------+
 
SanAlex :

nedense istemiyor - sıfırlar gösteriyor

Hatırladığım kadarıyla bu şey hiç çalışmadı ve bir pozisyondan komisyon alamıyorsunuz, geçmişten tüm işlemleri gözden geçirip, seçilen pozisyona ait olup olmadığını kontrol etmeniz ve özetlemeniz gerekiyor, dönüyor. oldukça zor, ama bir yerde bir kod örneği vardı, fxsaber'dan görünüyor.

 
transcendreamer :

Hatırladığım kadarıyla bu şey hiç çalışmadı ve bir pozisyondan komisyon alamıyorsunuz, geçmişten tüm işlemleri gözden geçirip, seçilen pozisyona ait olup olmadığını kontrol etmeniz ve özetlemeniz gerekiyor, dönüyor. oldukça zor, ama bir yerde bir kod örneği vardı, fxsaber'dan görünüyor.

fxsaber iyi patladı, tüm açık çiftler için toplam komisyon için bir hesaplama yapıldı

 
Aleksandr Egorov :

fxsaber iyi patladı, tüm açık çiftler için toplam komisyon için bir hesaplama yapıldı

Tam olarak, işte bağlantı: https://www.mql5.com/en/forum/93879/page5

Трудности перевода :)
Трудности перевода :)
  • 2016.09.05
  • www.mql5.com
Хочу рассказать, как я перевел свой проект с MQL4 на 5-ку за одну ночь...
 
Eh, işte sorunun kendisi)) ciro için değil basit şeyleri basitleştirmek gerçekten imkansız değil mi, şişmek için PPC komisyonunu hesaplamanız gerekiyor
 
Aleksandr Egorov :
Eh, işte sorunun kendisi)) ciro için değil basit şeyleri basitleştirmek gerçekten imkansız değil mi, şişmek için PPC komisyonunu hesaplamanız gerekiyor

Evet, geliştiricilerin neden hazır bir işlev yapmadıkları belli değil ... belki bir gün yazarlar ... daha önce i-fonksiyonlar yoktu ve herkes de kıvranıyordu ... şimdi var ... belki komisyonları bekleyeceğiz ...

 
transcendreamer :

Evet, geliştiricilerin neden hazır bir işlev yapmadıkları belli değil ... belki bir gün yazarlar ... daha önce i-fonksiyonlar yoktu ve herkes de kıvranıyordu ... şimdi var ... belki komisyonları bekleyeceğiz ...

evet, muhtemelen kendin yapmak daha hızlı olacaktır

 
SanAlex :

nedense istemiyor - sıfırlar gösteriyor

hala sıfır ve komisyonu göstermek istemiyor

 //+------------------------------------------------------------------+
//|                                                   Commission.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"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   double Commission=:: PositionGetDouble ( POSITION_COMMISSION );
// На случай, если POSITION_COMMISSION не работает
   if (Commission== 0 )
     {
       const ulong Ticket=GetPositionDealIn();
       if (Ticket> 0 )
        {
         const double LotsIn=:: HistoryDealGetDouble (Ticket, DEAL_VOLUME );
         if (LotsIn> 0 )
            Commission=:: HistoryDealGetDouble (Ticket, DEAL_COMMISSION )*:: PositionGetDouble ( POSITION_VOLUME )/LotsIn;
        }
     }
//---
   string msg_1= DoubleToString (Commission, 2 );
   string msg= DoubleToString (GetPositionCommission(), 2 );
   Print (msg_1, "     " ,msg);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetPositionCommission( void )
  {
   double Commission=:: PositionGetDouble ( POSITION_COMMISSION );
// На случай, если POSITION_COMMISSION не работает
   if (Commission== 0 )
     {
       const ulong Ticket=GetPositionDealIn();
       if (Ticket> 0 )
        {
         const double LotsIn=:: HistoryDealGetDouble (Ticket, DEAL_VOLUME );
         if (LotsIn> 0 )
            Commission=:: HistoryDealGetDouble (Ticket, DEAL_COMMISSION )*:: PositionGetDouble ( POSITION_VOLUME )/LotsIn;
        }
     }
   return (Commission);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
ulong GetPositionDealIn( const ulong HistoryTicket= 0 )
  {
   ulong Ticket= 0 ;
   if ((HistoryTicket== 0 ) ? :: HistorySelectByPosition (:: PositionGetInteger ( POSITION_TICKET )) : :: HistorySelectByPosition (HistoryTicket))
     {
       const int Total=:: HistoryDealsTotal ();
       for ( int i= 0 ; i<Total; i++)
        {
         const ulong TicketDeal=:: HistoryDealGetTicket (i);
         if (TicketDeal> 0 )
             if (( ENUM_DEAL_ENTRY ):: HistoryDealGetInteger (TicketDeal, DEAL_ENTRY )== DEAL_ENTRY_IN )
              {
               Ticket=TicketDeal;
               break ;
              }
        }
     }
   return (Ticket);
  }
//+------------------------------------------------------------------+
 
İşte başka bir soru, EMA çizgisinin altında veya üstünde bir çubuk kapandığında bir pozisyonun nasıl açılacağı .
Yarısını yaptım, iClose'u ekledim ama bir hata var. her çubuktan sonra yeni bir pozisyon açar


bende böyle var



   bool Buy_Condition = (close1 > EMA0[ 0 ]);

     {  
       if (Buy_Condition) //Buy
            {
       if (!RefreshRates())
         return ;
      TimeBar=time_0;
      my_TP = m_symbol.Ask() + ExtTakeProfit* Point ();
      my_SL = m_symbol.Ask() - ExtStopLoss* Point ();
      my_lot = Lots;
      OPENORDER( "Sell" );
            }
      }

   bool Sell_Condition = (close1 < EMA0[ 0 ]);

    {
     if (Sell_Condition )
         {
       if (!RefreshRates())
         return ;
      TimeBar=time_0;
      my_TP  = m_symbol.Bid() - ExtTakeProfit* Point ();
      my_SL  = m_symbol.Bid() + ExtStopLoss* Point ();

      my_lot= Lots;
      OPENORDER( "Buy" );
         }
     }
 } 
   if (colorBuffer[m_bar_current+ 1 ]>colorBuffer[m_bar_current] ) //Buy
     {
       if (!RefreshRates())
         return ;
      TimeBar=time_0;
      CLOSEORDER( "Sell" );
     }
 
   if (colorBuffer[m_bar_current+ 1 ]<colorBuffer[m_bar_current] ) //Sell
     {
       if (!RefreshRates())
         return ;
      TimeBar=time_0;
      CLOSEORDER( "Buy" );
     }
 
   return ;
  }
  
//--------------------------------------------------------------------
void CLOSEORDER( string ord)
  {
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--)   // returns the number of open positions
       if (m_position.SelectByIndex(i))
         if (m_position. Symbol ()== Symbol () && m_position.Magic()==m_magic)
           {
             if (m_position.PositionType()== POSITION_TYPE_BUY && ord== "Buy" )
               m_trade.PositionClose(m_position.Ticket());   // Close Buy
             if (m_position.PositionType()== POSITION_TYPE_SELL && ord== "Sell" )
               m_trade.PositionClose(m_position.Ticket()); // Close Sell
           }
  }
//--------------------------------------------------------------------

void OPENORDER( string ord)
  {
   if (ord== "Sell" )
   if (all_positions== 1 )
  
       for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions
         if (m_position.SelectByIndex(i))
           if (m_position.PositionType()== POSITION_TYPE_SELL )
             //if(m_position.PositionType()==POSITION_TYPE_SELL)
               return ;                           // Если buy, то не открываемся
 
       if (!m_trade.Sell(my_lot, Symbol (),m_symbol.Bid(),my_SL,my_TP, "" ))
         Print ( "Buy -> false. Result Retcode: " ,m_trade.ResultRetcode(),
               ", description of result: " ,m_trade.ResultRetcodeDescription(),
               ", ticket of deal: " ,m_trade.ResultDeal());
   if (ord== "Buy" )
   if (all_positions== 1 )
 
       for ( int i= PositionsTotal ()- 1 ;i>= 0 ;i--) // returns the number of open positions
         if (m_position.SelectByIndex(i))
             //if(m_position.PositionType()==POSITION_TYPE_BUY)
             if (m_position.PositionType()== POSITION_TYPE_BUY )
               return ;                           // Если buy, то не открываемся
 

       if (!m_trade.Buy(my_lot, Symbol (),m_symbol.Ask(),my_SL,my_TP, "" ))
         Print ( "BUY_STOP -> false. Result Retcode: " ,m_trade.ResultRetcode(),
               ", description of Retcode: " ,m_trade.ResultRetcodeDescription(),
               ", ticket of order: " ,m_trade.ResultOrder());
   return ;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//| 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 );
  }
//+------------------------------------------------------------------+
//| Get Time for specified bar index                                 |
//+------------------------------------------------------------------+
datetime iTime ( const int index, string symbol= NULL , ENUM_TIMEFRAMES timeframe= PERIOD_CURRENT )
  {
   if (symbol== NULL )
      symbol= Symbol ();
   if (timeframe== 0 )
      timeframe= Period ();
   datetime Time[];
   datetime time= 0 ;
   ArraySetAsSeries (Time, true );
   int copied= CopyTime (symbol,timeframe,index, 1 ,Time);
   if (copied> 0 )
      time=Time[ 0 ];
   return (time);
  }
//+------------------------------------------------------------------+
//| 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);
 
 
}


açık sipariş olup olmadığının yeterince kontrol edilmediği anlamına mı geliyor?




Dosyalar:
Unbenannt5.PNG  28 kb
 
Eugen8519 :
İşte başka bir soru, EMA çizgisinin altında veya üstünde bir çubuk kapandığında bir pozisyonun nasıl açılacağı .
Yarısını yaptım, iClose'u ekledim ama bir hata var. her çubuktan sonra yeni bir pozisyon açar

Göstergede bir sinyal oluşturmak ve ardından bunu Uzman Danışmana girmek en iyisidir

Fx10

 //+------------------------------------------------------------------+
//|                                                         Fx10.mq5 |
//|                                   Copyright © 2000-2007, palanka |
//|                                         http://www.metaquotes.ru |
//+------------------------------------------------------------------+
//---- авторство индикатора
#property copyright "Copyright © 2000-2007, palanka"
//---- ссылка на сайт автора
#property link        ""
//---- номер версии индикатора
#property version    "1.02"
//---- отрисовка индикатора в главном окне
#property indicator_chart_window
//---- для расчета и отрисовки индикатора использовано два буфера
#property indicator_buffers 2
//---- использовано всего два графических построения
#property indicator_plots    2
//+----------------------------------------------+
//|  Объявление констант                         |
//+----------------------------------------------+
#define RESET   0 // константа для возврата терминалу команды на пересчет индикатора
//+----------------------------------------------+
//|  Параметры отрисовки медвежьего индикатора   |
//+----------------------------------------------+
//---- отрисовка индикатора 1 в виде символа
#property indicator_type1    DRAW_ARROW
//---- в качестве цвета индикатора использован цвет Magenta
#property indicator_color1   Magenta
//---- толщина линии индикатора 1 равна 4
#property indicator_width1    4
//---- отображение метки индикатора
#property indicator_label1    "Fx10 Sell"
//+----------------------------------------------+
//|  Параметры отрисовки бычьего индикатора      |
//+----------------------------------------------+
//---- отрисовка индикатора 2 в виде символа
#property indicator_type2    DRAW_ARROW
//---- в качестве цвета индикатора использован цвет Lime
#property indicator_color2   Lime
//---- толщина линии индикатора 2 равна 4
#property indicator_width2    4
//---- отображение метки индикатора
#property indicator_label2 "Fx10 Buy"
//+----------------------------------------------+
//| Входные параметры индикатора                 |
//+----------------------------------------------+
input double ParmMult= 1.0 ; // multiply the standard parameters by this scale factor
//+----------------------------------------------+
//---- объявление динамических массивов, которые в дальнейшем
//---- будут использованы в качестве индикаторных буферов
double SellBuffer[];
double BuyBuffer[];
//---- объявление целочисленных переменных начала отсчета данных
int min_rates_total;
//---- объявление целочисленных переменных для хендлов индикаторов
int MA5_Handle,MA10_Handle,RSI_Handle,STO_Handle,MACD_Handle,ATR_Handle;
int OldTrend;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//---- инициализация глобальных переменных
   min_rates_total= int (ParmMult* 26 + 1 );
//---- получение хендла индикатора MA5
   MA5_Handle= iMA ( NULL , 0 , int (ParmMult* 5 ), 0 , MODE_LWMA , PRICE_CLOSE );
   if (MA5_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iMA5" );
//---- получение хендла индикатора MA10
   MA10_Handle= iMA ( NULL , 0 , int (ParmMult* 10 ), 0 , MODE_SMA , PRICE_CLOSE );
   if (MA10_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iMA10" );
//---- получение хендла индикатора RSI
   RSI_Handle= iRSI ( NULL , 0 , int (ParmMult* 14 ), PRICE_CLOSE );
   if (RSI_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iRSI" );
//---- получение хендла индикатора Stochastic
   STO_Handle= iStochastic ( NULL , 0 , int ( 5 *ParmMult), int ( 3 *ParmMult), int ( 3 *ParmMult), MODE_SMA , STO_LOWHIGH );
   if (STO_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iStochastic" );
//---- получение хендла индикатора MACD
   MACD_Handle= iMACD ( NULL , 0 , int ( 12 *ParmMult), int ( 26 *ParmMult), int ( 9 *ParmMult), PRICE_CLOSE );
   if (MACD_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора iMACD" );
//---- получение хендла индикатора ATR
   ATR_Handle= iATR ( NULL , 0 , 15 );
   if (ATR_Handle== INVALID_HANDLE )
       Print ( " Не удалось получить хендл индикатора ATR" );
//---- превращение динамического массива SellBuffer[] в индикаторный буфер
   SetIndexBuffer ( 0 ,SellBuffer, INDICATOR_DATA );
//---- осуществление сдвига начала отсчета отрисовки индикатора 1
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,min_rates_total);
//---- символ для индикатора
   PlotIndexSetInteger ( 0 , PLOT_ARROW , 119 );
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 );
//---- индексация элементов в буфере, как в таймсерии
   ArraySetAsSeries (SellBuffer, true );
//---- превращение динамического массива BuyBuffer[] в индикаторный буфер
   SetIndexBuffer ( 1 ,BuyBuffer, INDICATOR_DATA );
//---- осуществление сдвига начала отсчета отрисовки индикатора 2
   PlotIndexSetInteger ( 1 , PLOT_DRAW_BEGIN ,min_rates_total);
//---- символ для индикатора
   PlotIndexSetInteger ( 1 , PLOT_ARROW , 119 );
//---- установка значений индикатора, которые не будут видимы на графике
   PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0 );
//---- индексация элементов в буфере, как в таймсерии
   ArraySetAsSeries (BuyBuffer, true );
//---- установка формата точности отображения индикатора
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
//---- имя для окон данных и метка для подокон
   string short_name= "Fx10" ;
   IndicatorSetString ( INDICATOR_SHORTNAME ,short_name);
//----
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---- проверка количества баров на достаточность для расчета
   if ( BarsCalculated (MA5_Handle)<rates_total
      || BarsCalculated (MA10_Handle)<rates_total
      || BarsCalculated (RSI_Handle)<rates_total
      || BarsCalculated (STO_Handle)<rates_total
      || BarsCalculated (MACD_Handle)<rates_total
      || BarsCalculated (ATR_Handle)<rates_total
      || rates_total<min_rates_total)
       return (RESET);
//---- объявления локальных переменных
   int to_copy,limit,bar;
   double MA5[],MA10[],RSI[],STO[],MACD[],STOS[],MACDS[],ATR[];
   bool RsiUp,RsiDn,StochUp,StochDn,MacdUp,MacdDn;
//---- расчеты необходимого количества копируемых данных и
//---- и стартового номера limit для цикла пересчета баров
   if (prev_calculated>rates_total || prev_calculated<= 0 ) // проверка на первый старт расчета индикатора
      limit=rates_total-min_rates_total;   // стартовый номер для расчета всех баров
   else
      limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров
   to_copy=limit+ 1 ;
//---- копируем вновь появившиеся данные в массивы
   if ( CopyBuffer (MA5_Handle, 0 , 0 ,to_copy,MA5)<= 0 )
       return (RESET);
   if ( CopyBuffer (MA10_Handle, 0 , 0 ,to_copy,MA10)<= 0 )
       return (RESET);
   if ( CopyBuffer (RSI_Handle, 0 , 0 ,to_copy,RSI)<= 0 )
       return (RESET);
   if ( CopyBuffer (STO_Handle, 0 , 0 ,to_copy,STO)<= 0 )
       return (RESET);
   if ( CopyBuffer (STO_Handle, 1 , 0 ,to_copy,STOS)<= 0 )
       return (RESET);
   if ( CopyBuffer (MACD_Handle, 0 , 0 ,to_copy,MACD)<= 0 )
       return (RESET);
   if ( CopyBuffer (MACD_Handle, 1 , 0 ,to_copy,MACDS)<= 0 )
       return (RESET);
   if ( CopyBuffer (ATR_Handle, 0 , 0 ,to_copy,ATR)<= 0 )
       return (RESET);
//---- индексация элементов в массивах, как в таймсериях
   ArraySetAsSeries (MA5, true );
   ArraySetAsSeries (MA10, true );
   ArraySetAsSeries (RSI, true );
   ArraySetAsSeries (STO, true );
   ArraySetAsSeries (STOS, true );
   ArraySetAsSeries (MACD, true );
   ArraySetAsSeries (MACDS, true );
   ArraySetAsSeries (ATR, true );
   ArraySetAsSeries (high, true );
   ArraySetAsSeries (low, true );
//---- основной цикл расчета индикатора
   for (bar=limit; bar>= 0 && ! IsStopped (); bar--)
     {
      BuyBuffer[bar]= 0.0 ;
      SellBuffer[bar]= 0.0 ;
       if (MA5[bar]>MA10[bar])
        {
         RsiUp=RSI[bar]>= 55.0 ;
         StochUp=STO[bar]>STOS[bar];
         MacdUp=MACD[bar]>MACDS[bar];
         if (StochUp && RsiUp && MacdUp)
           {
             if (OldTrend< 0 )
               BuyBuffer[bar]=low[bar]-ATR[bar]* 3 / 8 ;
             if (bar!= 0 )
               OldTrend=+ 1 ;
           }
        }
       if (MA5[bar]<MA10[bar])
        {
         RsiDn=RSI[bar]<= 45.0 ;
         StochDn=STO[bar]<STOS[bar];
         MacdDn=MACD[bar]<MACDS[bar];
         if (StochDn && RsiDn && MacdDn)
           {
             if (OldTrend> 0 )
               SellBuffer[bar]=high[bar]+ATR[bar]* 3 / 8 ;
             if (bar!= 0 )
               OldTrend=- 1 ;
           }
        }
     }
//----
   return (rates_total);
  }
//+------------------------------------------------------------------+
Fx10 3
Dosyalar:
Exp_Fx10.mq5  16 kb