초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1322

 
좋은 오후입니다. 루프에서 계산할 수 있는 동일한 유형의 표시기 버퍼 가 많이 있지만 표시기 버퍼의 배열을 만드는 방법은 무엇입니까? 구조를 통해서 해보니 다 잘 되는 것 같았는데, SetIndexBuffer()는 에러 없이 잘 되었는데, OnCalculate()가 발생하면 어레이 크기가 변하지 않고 0으로 유지됩니다. 인디케이터 버퍼 계산을 하는 방법을 알려주세요. "buff_0" , "buff_1" 등과 같은 이름으로 순환할 수 있지만 수행 방법을 모르겠습니다((그리고 매우 긴 시트를 얻음)
 
SanAlex :

아마도 당신이 계획한대로 - 그것이 밝혀진 것 같습니다.

고맙습니다!

그렇긴 한데 내가 생각한 것과는 거리가 멀다!!! 추세에 따라(지표에 따라) 오더하고 테이크에 따라 청산되며, 마감되자마자 같은 방향(추세에 따라)으로 새로운 주문이 열리지만 이것은 일부일 뿐입니다. 내 생각의.

두 번째는 추세가 역전되었을 때 테이크에 의해 마감되지 않은 주문(가격 움직임 방향의 변화에 대한 표시기 신호)이 마감되어서는 안 되며(여러분이 한) 이제 Martngale을 적용해야 합니다. 그것, 즉 특정 단계, 승수 및 테이크업 평균으로 추세를 따르지 않는 미결 주문 .

간단히 말해서 두 부분은 쌍으로 작동해야 합니다.

 
Alexey Viktorov :

어제 나는이 기적을보기 위해 다운로드했습니다 ... 그리고 갑자기 그들은 나에게 tyrnet을 박탈했습니다. 뇌우 후 하루가 끝날 때까지 기술 작업. 그래서 나는 게으름에서 이 기적을 여기 에 게시된 MQL5로 다시 작성하기로 결정했습니다.

선이 없으면 악도 없다는 것이 밝혀졌습니다. . . . . . .

매우 감사합니다!

제 아이디어를 실현해 주시면 도움이 될 것 같습니다!

 
VANDER :
구조를 통해 해봤는데 다 괜찮은 것 같았어요

작동하지 않습니까?

 int size= 100 ;

struct All
   {
   double buff[];
   } all[];

int OnInit ()
   {
   IndicatorBuffers(size);
   ArrayResize (all,size);
   for ( int i= 0 ; i<size; i++)
      {
       SetIndexBuffer (i,all[i].buff);
      SetIndexStyle(i, DRAW_LINE );
      }
   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[])
   {
   for ( int i= 0 ; i<size; i++)
      {
      all[i].buff[shift]=i;
      }
   return (rates_total);
   }
 

Sprut 185 :

이제 Martngale을 적용해야 합니다. 특정 단계, 승수 및 테이크업 평균으로 추세를 따르지 않는 미결 주문.

간단히 말해서 두 부분은 쌍으로 작동해야 합니다.

다음 위치는 BUY에서 2-4-8-16의 이중 로트와 SELL에서 2-4-8-16의 반대로 열릴 것임을 의미합니까 ???

나는 그런 기능이 있습니다. 나는 그렇게 스스로를 눈멀게 했습니다.

 //+------------------------------------------------------------------+
//| ENUM_LOT_RISK                                                    |
//+------------------------------------------------------------------+
enum LotMax
  {
   Lot= 0 ,   // Lots
   Lotx2= 1 , // Lots*2
   Risk= 2 ,   // Risk
  };
//+------------------------------------------------------------------+
input LotMax InpLotRisk              = Risk;         // : Lots,- Lots*2,- Risk
input double MaximumRisk             = 0.02 ;         // : Maximum Risk in percentage
input double DecreaseFactor          = 3 ;             // : Descrease factor
 //+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized( void )
  {
   double price= 0.0 ;
   double margin= 0.0 ;
//--- select lot size
   if (! SymbolInfoDouble ( _Symbol , SYMBOL_ASK ,price))
       return ( 0.0 );
   if (! OrderCalcMargin ( ORDER_TYPE_BUY , _Symbol , 1.0 ,price,margin))
       return ( 0.0 );
   if (margin<= 0.0 )
       return ( 0.0 );
   double lot= NormalizeDouble ( AccountInfoDouble ( ACCOUNT_MARGIN_FREE )*MaximumRisk/margin, 2 );
//--- calculate number of losses orders without a break
   if (DecreaseFactor> 0 )
     {
       //--- select history for access
       HistorySelect ( 0 , TimeCurrent ());
       //---
       int     orders= HistoryDealsTotal ();   // total history deals
       int     losses= 0 ;                     // number of losses orders without a break
       for ( int i=orders- 1 ; i>= 0 ; i--)
        {
         ulong ticket= HistoryDealGetTicket (i);
         if (ticket== 0 )
           {
             Print ( "HistoryDealGetTicket failed, no trade history" );
             break ;
           }
         //--- check symbol
         if ( HistoryDealGetString (ticket, DEAL_SYMBOL )!= _Symbol )
             continue ;
         //--- check Expert Magic number
         if ( HistoryDealGetInteger (ticket, DEAL_MAGIC )!=UNO_MAGIC)
             continue ;
         //--- check profit
         double profit= HistoryDealGetDouble (ticket, DEAL_PROFIT );
         if (profit> 0.0 )
             break ;
         if (profit< 0.0 )
            losses++;
        }
       //---
       if (losses> 1 )
         lot= NormalizeDouble (lot-lot*losses/DecreaseFactor, 1 );
     }
//--- normalize and check limits
   double stepvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_STEP );
   lot=stepvol* NormalizeDouble (lot/stepvol, 0 );
   double minvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN );
   if (lot<minvol)
      lot=minvol;
   double maxvol= SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MAX );
   if (lot>maxvol)
      lot=maxvol;
//--- return trading volume
   return (lot);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double OptimizedBuy( void )
  {
   double PROFIT_BUY= 0.00 ;
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of open positions
     {
       string    position_GetSymbol= PositionGetSymbol (i); // GetSymbol позиции
       if (position_GetSymbol==m_symbol.Name())
        {
         if (m_position.PositionType()== POSITION_TYPE_BUY )
           {
            PROFIT_BUY=PROFIT_BUY+m_position.Select( Symbol ());
           }
        }
     }
   double Lots=MaximumRisk;
   double ab=PROFIT_BUY;
   switch (InpLotRisk)
     {
       case Lot:
         Lots=MaximumRisk;
         break ;
       case Lotx2:
         if (ab> 0 && ab<= 1 )
            Lots= MaximumRisk* 2 ;
         if (ab> 1 && ab<= 2 )
            Lots= MaximumRisk* 4 ;
         if (ab> 2 && ab<= 3 )
            Lots= MaximumRisk* 8 ;
         if (ab> 3 )
            Lots= TradeSizeOptimized();
         break ;
       case Risk:
         Lots=TradeSizeOptimized();
         break ;
     }
   return (Lots);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double OptimizedSell( void )
  {
   double PROFIT_SELL= 0.00 ;
   for ( int i= PositionsTotal ()- 1 ; i>= 0 ; i--) // returns the number of open positions
     {
       string    position_GetSymbol= PositionGetSymbol (i); // GetSymbol позиции
       if (position_GetSymbol==m_symbol.Name())
        {
         if (m_position.PositionType()== POSITION_TYPE_SELL )
           {
            PROFIT_SELL=PROFIT_SELL+m_position.Select( Symbol ());
           }
        }
     }
   double Lots=MaximumRisk;
   double ab=PROFIT_SELL;
   switch (InpLotRisk)
     {
       case Lot:
         Lots=MaximumRisk;
         break ;
       case Lotx2:
         if (ab> 0 && ab<= 1 )
            Lots= MaximumRisk* 2 ;
         if (ab> 1 && ab<= 2 )
            Lots= MaximumRisk* 4 ;
         if (ab> 2 && ab<= 3 )
            Lots= MaximumRisk* 8 ;
         if (ab> 3 )
            Lots= TradeSizeOptimized();
         break ;
       case Risk:
         Lots=TradeSizeOptimized();
         break ;
     }
   return (Lots);
  }
//+------------------------------------------------------------------+

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

OptimizedBuy() 및 OptimizedSell()이 포함된 InpLots 대신 포지션을 열 때 교체해야 합니다.

       if (m_trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , OptimizedBuy() ,price, 0.0 , 0.0 ))
       if (m_trade.PositionOpen( Symbol (), ORDER_TYPE_SELL , OptimizedSell() ,price, 0.0 , 0.0 ))
 
SanAlex :

다음 위치는 BUY에서 2-4-8-16의 이중 로트와 SELL에서 2-4-8-16의 반대로 열릴 것임을 의미합니까 ???

나는 그런 기능이 있습니다. 나는 그렇게 스스로를 눈멀게 했습니다.

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

OptimizedBuy() 및 OptimizedSell()이 포함된 InpLots 대신 포지션을 열 때 교체해야 합니다.

그러나 이 기능의 경우에도 이 기능을 갖는 것이 바람직합니다. 이익으로 마감되는 것(통화 기준)

 input double InpTProfit              = 40000 ;         // : Take Profit --> (In currency the amount)
input double InpSLoss                = 1000000 ;       // : Stop Loss --> (In currency the amount)
 //+------------------------------------------------------------------+
//| ProfitOnTick closing                                             |
//+------------------------------------------------------------------+
void ProfitOnTick( void )
  {
//---
   double PROFIT_BUY= 0.00 ;
   double PROFIT_SELL= 0.00 ;
   int total= PositionsTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       string    position_GetSymbol= PositionGetSymbol (i);
       if (position_GetSymbol==m_symbol.Name())
        {
         if (m_position.PositionType()== POSITION_TYPE_BUY )
           {
            PROFIT_BUY=PROFIT_BUY+ PositionGetDouble ( POSITION_PROFIT );
           }
         else
           {
            PROFIT_SELL=PROFIT_SELL+ PositionGetDouble ( POSITION_PROFIT );
           }
        }
       if (PROFIT_BUY<-InpSLoss || PROFIT_BUY>=InpTProfit)
        {
         CheckForCloseBuy();
        }
       if (PROFIT_SELL<-InpSLoss || PROFIT_SELL>=InpTProfit)
        {
         CheckForCloseSell();
        }
     }
  }
//+------------------------------------------------------------------+
 
SanAlex :

그러나 이 기능의 경우에도 이 기능을 갖는 것이 바람직합니다. 이익으로 마감되는 것(통화 기준)

제 아이디어 의 의미 와 생성 되는 Expert Advisor 의 운영 에 대해 좀 더 알기 쉽게 설명 드리겠습니다 .

우리는 간단한 Martin이 필요합니다. 예를 들어 Autoprofit 3에서는 주문 시작이 표시기 신호(추세를 따름)를 기반으로 하고 Autoprofit이 아닌 카드가 떨어지는 방식을 추가하기만 하면 됩니다.... ..... 그리고 그게 다야.

첨부 파일과 거의 동일한 출력 매개 변수를 사용합니다.
파일:
pbx0dcw.jpg  201 kb
 
Sprut 185 :

내 아이디어 의 의미 와 생성 되는 Expert Advisor 의 운영 을 좀 더 알기 쉽게 설명 하려고 합니다 .

우리는 간단한 Martin이 필요합니다. 예를 들어 Autoprofit 3에서는 주문 시작이 표시기 신호(추세를 따름)를 기반으로 하고 Autoprofit이 아닌 카드가 떨어지는 방식을 추가하기만 하면 됩니다.... ..... 그리고 그게 다야.

따라서 표시기의 신호에 따라 열립니다. 신호가 반대 방향으로 나타나는 경우에만 이미 다른 방향으로 열립니다. 해당 포지션이 이익으로 마감되지 않으면 이익으로 마감될 때까지 정지됩니다. 신호가 다른 방향으로 바뀌고 열린 신호를 닫으면 적합하지 않습니다.

 
SanAlex :

따라서 표시기의 신호에 따라 열립니다. 신호가 반대 방향으로 나타나는 경우에만 이미 다른 방향으로 열립니다. 해당 포지션이 이익으로 마감되지 않으면 이익으로 마감될 때까지 정지됩니다. 신호가 다른 방향으로 바뀌고 열린 신호를 닫으면 적합하지 않습니다.

맞습니다 ........... 그리고 그 포지션이 이익으로 마감되지 않으면 이익으로 마감될 때까지 정지됩니다.

그리고 이익으로 마감되지 않은 포지션( 예: 매수 )은 그대로 유지되어 특정 단계의 적자로 가는 것이 필요합니다. 여기서 다른 주문 (매수 )은 은밀히 거래량과 평균을 곱한 다른 주문입니다. 빨간색 등을 열 것입니다. 추세가 전개될 때까지, 그러나 스레드 에서 포지션의 개방은 멈추지 않을 것입니다.

그렇기 때문에 여기에서 Martin과 표시등 2개의 블록이 동시에 작동해야 한다고 썼습니다.

제가 설명을 잘 못 했다면 스카이프를 통해 데모를 켜서 어떻게 보여야 하는지 명확하게 보여줄 준비가 되어 있습니다.

 
Sprut 185 :

맞습니다 ........... 그리고 그 포지션이 이익으로 마감되지 않으면 이익으로 마감될 때까지 정지됩니다.

그리고 이익으로 마감되지 않은 포지션( 예: 매수 )은 그대로 유지되어 특정 단계의 적자로 가는 것이 필요합니다. 여기서 다른 주문 (매수 )은 거래량을 곱하고 평균을 은밀히 적자로 전환할 것입니다. 오픈 등 추세가 전개될 때까지, 그러나 스레드 에서 포지션의 개방은 멈추지 않을 것입니다.

그렇기 때문에 여기에서 Martin과 표시등 2개의 블록이 동시에 작동해야 한다고 썼습니다.

제가 설명을 잘 못 했다면 스카이프를 통해 데모를 켜서 어떻게 보여야 하는지 명확하게 보여줄 준비가 되어 있습니다.

Martin은 표시기 신호가 반대일 때만 켜야 합니까 아니면 이것에 관계 없이 켜야 합니까?

예: 지표에 따라 매수 포지션이 열립니다. 가격은 주어진 거리만큼 떨어졌고 표시기는 이미 매도를 표시하고 있습니다. 매수 포지션을 열어야 합니까?

사유: