MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1865

 
Mihail Matkovskij # :

그렇지는 않지만. 실적 추적 필요

또는 OnTradeTransaction의 새 기능. 그리고 자리가 없으면 들어가세요. 또는 BuySignal 또는 SellSignal에 신호를 작성하고 예제에서 보여준 것처럼 OnTimer에서 처리합니다.

ClosePosWithMaxProfitInCurrency

이 기능은 더 이상 관련이 없습니다. 그녀는 적합하지 않습니다. 그 자리는 가장 먼저 열린 주문(있는 경우)을 닫는 기능으로 대체되어야 합니다.

글로벌 수준에 등록된 변수 buySignal 및 SellSignal을 이해하지 못합니다. 그러나 컴파일 할 때

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect        



 

안녕하세요.

물론 이 모든 것을 읽고 각 주문을 개별적으로 칠할 수는 있지만 문제는 코드를 줄이는 것이 었습니다.

 
좋은 오후입니다, 동료들! 이전 막대가 아닌 표시기의 현재 값(현재)을 얻는 방법을 초보자에게 알려주십시오. 어드바이저는 이전 막대가 끝날 때만 작동하지만 더 일찍 필요합니다.
 
makssub # :

안녕하세요.

물론 이 모든 것을 읽고 각 주문을 개별적으로 칠할 수는 있지만 문제는 코드를 줄이는 것이 었습니다.

코드 축소에서 정확히 작동하지 않는 것은 무엇입니까?

 
Shockeir # :
좋은 오후입니다, 동료들! 이전 막대가 아닌 표시기의 현재 값(현재)을 얻는 방법을 초보자에게 알려주십시오. 어드바이저는 이전 막대가 끝날 때만 작동하지만 더 일찍 필요합니다.

아마도 상황에 대한 더 자세한 설명과 자신이 성공하지 못한다는 사실이 더 나은 결과를 줄 것입니다.

 
Andrey Sokolov # :

아마도 상황에 대한 더 자세한 설명과 자신이 성공하지 못한다는 사실이 더 나은 결과를 줄 것입니다.

표준 확률 지표. EA는 라인 K와 D의 교차점에서 트리거되어야 합니다. 바로 교차점에서 새 막대가 나타날 때까지 아무 일도 일어나지 않습니다. 새 막대가 나타나자 마자 조건이 여전히 충족되면 조치가 발생합니다. 내가 이해하는 한 이것은 표시기 버퍼의 마지막 값이 마지막으로 완료된 막대에서 계산된다는 사실 때문입니다. 따라서 아직 완료되지 않은 막대에서 트리거가 발생하고 싶습니다.

 
Shockeir # :

표준 확률 지표. EA는 라인 K와 D의 교차점에서 트리거되어야 합니다. 바로 교차점에서 새 막대가 나타날 때까지 아무 일도 일어나지 않습니다. 새 막대가 나타나자 마자 조건이 여전히 충족되면 조치가 발생합니다. 내가 이해하는 한 이것은 표시기 버퍼의 마지막 값이 마지막으로 완료된 막대에서 계산된다는 사실 때문입니다. 따라서 아직 완료되지 않은 막대에서 트리거가 발생하고 싶습니다.

마지막 캔들의 인덱스는 0입니다.

그리고 그는 그것을 해결하기 위해 어떻게 노력했습니까? 도움말을 읽었습니까? 정확히 작동하지 않는 것은 무엇입니까?

 
Andrey Sokolov # :

코드를 붙여넣을 수 있습니까? 적어도 당신이하고있는 언어가 명확하도록

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link        " https://www.mql5.com "
#property version    "1.00"

//--- input parameters
input double    crossDepthOpen= 7 ;     //Глубина пересечения K и D для открытия
input double    crossDepthClose=- 2 ;   //Глубина пересечения K и D для закрытия
input double    closeCoef= 5 ;         //Коэффициент изменения глубины закрытия
input int       k_period= 8 ;           //Период K
input int       d_period= 3 ;           //Период В
input int       slowing= 3 ;           //Сглаживание
input double    tp_1= 20 ;             //Тейк
input double    sl_1= 60 ;             //Лосс
input double    maxPos= 2.0 ;           //Размер лота

int       stoch_handle;
double    k_buffer[ 1 ];
double    d_buffer[ 1 ];
double    TKP;
double    STL;
double    CDO;
double    CDC;
int       lossCount= 0 ;
int       profitCount= 0 ;
int       EA_magic= 12345 ;


//| Expert initialization function

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   TKP=tp_1;
   STL=sl_1;

   stoch_handle= iStochastic ( _Symbol , PERIOD_CURRENT ,k_period,d_period,slowing, MODE_EMA , STO_LOWHIGH );
   if (stoch_handle< 0 )
     {
       Alert ( "Ошибка при создании индикаторов " , GetLastError ());
       return ( 0 );
     }
   return ( INIT_SUCCEEDED );
  }

//| Expert tick function

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
   CDO=crossDepthOpen;
   CDC=crossDepthClose;
   MqlTick latestPrice;
   MqlTradeResult mResult;
   MqlTradeRequest mRequest;
   ZeroMemory (mRequest);
   SymbolInfoTick ( _Symbol ,latestPrice);
   ArraySetAsSeries (k_buffer, true );
   ArraySetAsSeries (d_buffer, true );
   if ( CopyBuffer (stoch_handle, 0 , 0 , 1 ,k_buffer)< 0 )
     {
       Alert ( "Не удалось скопировать в буфер K" , GetLastError ());
       return ;
     }
   if ( CopyBuffer (stoch_handle, 1 , 0 , 1 ,d_buffer)< 0 )
     {
       Alert ( "Не удалось скопировать в буфер D" , GetLastError ());
       return ;
     }

   bool buyFullOpened= false ;
   bool buyPartOpened= false ;
   bool sellFullOpened= false ;
   bool sellPartOpened= false ;

//Состояние позиций
   if ( PositionSelect ( _Symbol )== true )
     {
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
        {
         if ( PositionGetDouble ( POSITION_VOLUME )>=maxPos)
           {
            buyFullOpened= true ;
           }
         else
           {
            buyPartOpened= true ;
           }
        }
       else
         if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
           {

             if ( PositionGetDouble ( POSITION_VOLUME )>=maxPos)
              {
               sellFullOpened= true ;
              }
             else
              {
               sellPartOpened= true ;
              }
           }
     }
//состояние позиций конец

//Условия изменения позиций
   bool buyOpenCondition=k_buffer[ 0 ]>((d_buffer[ 0 ])+CDO);
   bool buyCloseCondition=k_buffer[ 0 ]<((d_buffer[ 0 ])-CDC);
   bool buyTPCondition=latestPrice.bid>( PositionGetDouble ( POSITION_PRICE_OPEN )+TKP* _Point );
   bool buySLCondition=latestPrice.bid<( PositionGetDouble ( POSITION_PRICE_OPEN )-STL* _Point );
   bool sellOpenCondition=k_buffer[ 0 ]<((d_buffer[ 0 ])-CDO);
   bool sellCloseCondition=k_buffer[ 0 ]>((d_buffer[ 0 ])+CDC);
   bool sellTPCondition=latestPrice.ask<( PositionGetDouble ( POSITION_PRICE_OPEN )-TKP* _Point );
   bool sellSLCondition=latestPrice.ask>( PositionGetDouble ( POSITION_PRICE_OPEN )+STL* _Point );
//Условия изменения позиций конец

//Проверка и выполнение действий
   if (buyOpenCondition)
     {
       if (!buyFullOpened && !buyPartOpened && !sellPartOpened && !sellFullOpened)
        {
         Print ( "Покупка по сигналу" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.ask, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.ask - STL*Point(),_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = maxPos;
         OrderSend (mRequest,mResult);
         Print ( "Открыто " , PositionGetDouble ( POSITION_VOLUME ), " по " , PositionGetDouble ( POSITION_PRICE_OPEN ));
        }
     }
//Условия покупки
   if (sellTPCondition)
     {
       if (sellFullOpened)
        {
         Print ( "Тейк-профит шорта" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.ask, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = MathRound ( PositionGetDouble ( POSITION_VOLUME )/ 2 );
         OrderSend (mRequest,mResult);
         ++profitCount;
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

   if (sellSLCondition)
     {
       if (sellFullOpened || sellPartOpened)
        {
         Print ( "Стоп-лосс шорта" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.ask, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = PositionGetDouble ( POSITION_VOLUME );
         OrderSend (mRequest,mResult);
         ++lossCount;
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

   if (sellCloseCondition)
     {
       if (sellFullOpened || sellPartOpened)
        {
         Print ( "Закрытие шорта по сигналу" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         Print (k_buffer[ 0 ], " " ,d_buffer[ 0 ]);
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.ask, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.ask - STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.ask + TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_BUY ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = PositionGetDouble ( POSITION_VOLUME );
         OrderSend (mRequest,mResult);
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

//Условия продажи
   if (sellOpenCondition)
     {
       if (!sellFullOpened && !buyPartOpened && !sellPartOpened && !buyFullOpened)
        {
         Print ( "Продажа по сигналу" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         Print (k_buffer[ 0 ], " " ,d_buffer[ 0 ]);
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.bid, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = maxPos;
         OrderSend (mRequest,mResult);
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }
   if (buyTPCondition)
     {
       if (buyFullOpened)
        {
         Print ( "Тейк-профит лонга" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.bid, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = MathRound ( PositionGetDouble ( POSITION_VOLUME )/ 2 );
         OrderSend (mRequest,mResult);
         ++profitCount;
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

   if (buySLCondition)
     {
       if (buyFullOpened || buyPartOpened)
        {
         Print ( "Стоп-лосс лонга" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         Print (k_buffer[ 0 ], " " ,d_buffer[ 0 ]);
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.bid, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = PositionGetDouble ( POSITION_VOLUME );
         OrderSend (mRequest,mResult);
         ++lossCount;
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }

   if (buyCloseCondition)
     {
       if (buyFullOpened || buyPartOpened)
        {
         Print ( "Закрытие лонга по сигналу" );
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
         Print ( "Цена открытия " , PositionGetDouble ( POSITION_PRICE_OPEN ));
         Print (k_buffer[ 0 ], " " ,d_buffer[ 0 ]);
         mRequest.action = TRADE_ACTION_DEAL ;
         mRequest.symbol = _Symbol ;
         mRequest.price = NormalizeDouble (latestPrice.bid, _Digits );
         mRequest.sl = 0 ; //NormalizeDouble(latestPrice.bid + STL*_Point,_Digits);
         mRequest.tp = 0 ; //NormalizeDouble(latestPrice.bid - TKP*_Point,_Digits);
         mRequest.magic = EA_magic;
         mRequest.type = ORDER_TYPE_SELL ;
         mRequest.type_filling = ORDER_FILLING_FOK ;
         mRequest.deviation= 100 ;
         mRequest.volume = PositionGetDouble ( POSITION_VOLUME );
         OrderSend (mRequest,mResult);
         Print ( "Текущий объем позиций " , PositionGetDouble ( POSITION_VOLUME ));
        }
     }
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade ()
  {
//---

  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   IndicatorRelease (stoch_handle);
   Print ( "loss " ,lossCount);
   Print ( "profit " ,profitCount);
  }
//+------------------------------------------------------------------+
안드레이 소콜로프

코드를 붙여넣을 수 있습니까? 적어도 당신이하고있는 언어가 명확하도록

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론

글라브레드FX , 2022.01.17 22:52

ClosePosWithMaxProfitInCurrency

이 기능은 더 이상 관련이 없습니다. 그녀는 적합하지 않습니다. 그 자리는 가장 먼저 열린 주문(있는 경우)을 닫는 기능으로 대체되어야 합니다.

글로벌 수준에 등록된 변수 buySignal 및 SellSignal을 이해할 수 없습니다. 그러나 컴파일 할 때 제공합니다.

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect        



등록된 대로 컴파일러는 어디에서 맹세합니까? 나는 추측할 수 없다. 이해하려면 소스 코드가 필요합니다.
 
Shockeir # :
좋은 오후입니다, 동료들! 이전 막대가 아닌 표시기의 현재 값(현재)을 얻는 방법을 초보자에게 알려주십시오. 어드바이저는 이전 막대가 끝날 때만 작동하지만 더 일찍 필요합니다.

k_buffer[0] 및 d_buffer[0] 배열에는 표시기의 마지막 값이 포함됩니다. 그것들을 꺼내서 직접 확인하는 것이 문제입니까?