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

 
Seric29 :

이러한 질문: double은 0에서 4까지, datetame은 5에서 9까지, int는 10에서 14까지 저장되는 1차원 배열을 만들고 싶습니다. 이것을 mql4에서 구성할 수 있습니까? 그렇다면 어떻게 구조가 있는 예제를 보았는지 보여 주지만 C++로 되어 있지만 사이트에 대한 링크를 잃어버렸습니까?

각 유형에 대해 특정 배열 셀이 있는 경우 배열 대신 구조를 만드십시오.

 
Koldun Zloy :

각 유형에 대해 특정 배열 셀이 있는 경우 배열 대신 구조를 만드십시오.

불행히도 그는 작업을 공식화할 수도 없습니다

한편으로 커뮤니케이션은 그가 C++/MQL의 엄격한 타이핑에서 벗어나고 싶어하는 것처럼 보입니다. 여기에 토론이 있는 좋은 주제가 있습니다. 하지만 그것이 그를 도울 수 있을지 의심스럽습니다. https://www.mql5.com/ru/ 포럼/294094

토론 과정에서(내 생각에는 이미 3개월 동안 진행되었습니까? ) @Seric29 는 여전히 기능 서명에 대한 설명에서 벗어나 일종의 "팬텀" 기능 을 가져와야 한다는 것이 지속적으로 밝혀졌습니다. 임의의 수의 매개변수를 전달할 수 있는

그런 다음 토론 중에 다차원 동적 배열이 이 모든 것에 참여해야 하며 이러한 배열은 매개변수로 함수에 전달되어야 한다는 것이 밝혀졌습니다.

저것들. 공식화 된 작업이 전혀 없으며 솔루션이 끊임없이 "현장에서 외침"으로 끝나고 개발자가 무언가의 기능을 줄이고 루프 연산자의 소스 코드를 제공하면 다시 실행하겠습니다. 마지막:

Seric29 :
mql4 개발자에게 편지를 쓰는 방법, 컴파일러 코드를 보는 방법, 정적이지 않도록 추가 기능을 추가할 수 있습니까?

... 일반적으로 이와 같은 것 ... "뇌 제거"라는 문구는 말할 수있는 최소한의 것입니다))))

 

그렇기 때문에 자세한 정보는 제공하지 않습니다.

기본을 배우는 것에서 벗어날 수 없습니다.

 
Koldun Zloy :

기본을 배우는 것에서 벗어날 수 없습니다.

여기서 흥미로운 점은 사람이 기본 사항을 배우지 않고 이미 이 모든 것을 알고 있다는 것을 보여주려고 하고, 여러분 모두가 그가 일을 하지 못하도록 막는다는 것입니다.)

 
Taras Slobodyanik :

여기서 흥미로운 점은 사람이 기본 사항을 배우지 않고 이미 이 모든 것을 알고 있다는 것을 보여주려고 하고, 여러분 모두가 그가 일을 하지 못하도록 막는다는 것입니다.)

인사말. 나는 유능한 비디오 "MQL4에서 MQL5로 - Metatrader 5를 위한 Expert Advisor를 다시 작성하는 방법"을 보았습니다.
작가님께 큰 존경을 표합니다. 직접 시도하기로 결정했습니다. 썼다. 아이디어는 다음과 같습니다.
1. 입력에서 dtriger = 1로 설정했습니다. 구매가 열립니다.
2. 입력에서 dtriger = -1로 설정 - Sell이 열립니다.
3. 입력에서 dtriger = 0으로 설정했습니다. 열려 있는 모든 항목이 닫힙니다.
도움말 페이지에서 MT5에서 반대 위치를 유지할 수 없다고 읽었습니다.
그리고 나는 그것들을 가지고 있다.
질문: 현재 위치의 마감을 올바르게 등록하는 방법은 다음과 같습니다.
오프닝 턴(역방향).
매우 감사합니다.

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

cPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_symbol;
COOrderInfo o_order;

입력 int 트리거 = 0;
입력 더블 StartLot = 0.01;
입력 이중 lpos_volume = 1.0;
입력 intStep = 10;
입력 정수 MagicNumber = 12345; // 매직 누아버
입력 int 미끄러짐 = 30; // 슬립 페이지

인트 트리거;
정수 dStep;

//+----------------------------------------------- --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- --------------------+
int OnInit()
{
dStep = 단계 ;
dtrigger = 트리거 ;

if (!o_symbol.Name(Symbol()))
반환(INIT_FAILED);

새로 고침();

o_trade.SetExpertMagicNumber(MagicNumber) ;

if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK);
}
그렇지 않으면 (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC);
}
또 다른
{
o_trade.SetTypeFilling( ORDER_FILLING_RETURN );
}
o_trade.SetDeviationInPoints(슬립페이지);

if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
d스텝 = 10 ;
}

반환(INIT_SUCCESSED);
}
//+----------------------------------------------- --------------------+
//| 전문적인 초기화 해제 기능 |
//+----------------------------------------------- --------------------+
무효 OnDeinit(const int 이유)
{
}
//+----------------------------------------------- --------------------+
//| 전문가 틱 기능 |
//+----------------------------------------------- --------------------+
무효 OnTick()
{
날짜 시간 lpos_time = 0;
이중 lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
정수 pos_count = 0;
더블 sum_profit = 0;

for (int i = PositionsTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)
{
lpos_time = o_position.Time(); //주문오픈타임();
lpos_price_open = o_position.PriceOpen(); //주문오픈가격();
lpos_type = o_position.PositionType() ; //주문유형();
}

pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
}
}
}

// 대기 중인 주문의 수를 계산합니다.
정수 stop_count=0;

for (int i=OrdersTotal()-1; i >=0; i--)
{
if (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}

if (! 새로 고침 빈도())
반품;

if(트리거 == 0 )
{
CloseAll();
반품;
}

// + ----- 첫 번째 주문 열기 ++++++++++
if (pos_count == 0 && stop_count == 0 )
{
if ( dtrigger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume, o_symbol.Name()); // 셀 L 11111
}

if ( 디트리거 == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume, o_symbol.Name()); // BU Y 11111
}
}


// + ----- 뒤집기 ++++++++++++++++++++++++++++++++

if (pos_count>0)
{
if(lpos_type == POSITION_TYPE_BUY )
{
if ( dtrigger == -1 )
{
o_trade.Sell(StartLot * lpos_volume, o_symbol.Name()); // 매도 +++++
}
}

if (lpos_type==POSITION_TYPE_SELL )
{
if ( 트리거 == 1 )
{
o_trade.Buy(StartLot * lpos_volume, o_symbol.Name()); // 구매 +++++
}
}
}


if(pos_count>0 && stop_count>0)
DeleteStopOrders() ;

}
//------------------------------------------------ -----------
bool 새로 고침 비율()
{
if (!o_symbol.RefreshRates())
반환(거짓) ;

if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
반환(거짓);

반환(참);
}
//--- ------------------------------------------- --------- ------------
bool IsFillingTypeAllowed(문자열 기호, int fill_type)
{
정수 채우기 = (int)SymbolInfoInteger(기호, SYMBOL_FILLING_MODE);

return((채우기 && 채우기 유형) == 채우기 유형) ;
}

// ------------------------------------------------ --
CloseAll() 무효화
{
for (int 인덱스 = PositionsTotal()-1, 인덱스 >=0, 인덱스--)
{
if (o_position.SelectByIndex(인덱스))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket());
}
}
}
}

//------------------------------------------------ -----------
// 모든 보류 주문 삭제
//--------------------------------------------
무효 DeleteStopOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
if (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket());
}
}

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

 
procom :

인사말....

코드를 올바르게 붙여넣으십시오.


 
Artyom Trishkin :

코드를 올바르게 붙여넣으십시오.


좋아요
 #include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int           triger            = 0 ;
input double     StartLot             = 0.01 ;
input double     lpos_volume       = 1.0 ;
input int           Step         = 10 ;
input int           MagicNumber    = 12345 ;       //      Magic   nuaber
input int           Slippage          = 30 ;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name( Symbol ()))
     return ( INIT_FAILED );
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK ))
   { 
      o_trade.SetTypeFilling( ORDER_FILLING_FOK );
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC ))
   { 
      o_trade.SetTypeFilling( ORDER_FILLING_IOC );
   }
   else 
   {
      o_trade.SetTypeFilling( ORDER_FILLING_RETURN );
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol. Digits () == 3 || o_symbol. Digits () == 5 )
   {
      dStep = 10 ;
   }
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
       datetime               lpos_time          =         0 ;
       double                 lpos_price_open    =         0.0 ;
       ENUM_POSITION_TYPE    lpos_type           =        - 1 ;
       int                       pos_count               =         0 ;
       double                 sum_profit         = 0 ;
 
   for ( int i = PositionsTotal () - 1 ; i>= 0 ; i--)
   {
       if (o_position.SelectByIndex(i))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
             if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();             //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
   int stop_count= 0 ;

   for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--) 
   {
       if (o_order.SelectByIndex(i)) 
      {
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if (dtriger == 0 )
   {
      CloseAll();
       return ;               
   } 
   
   // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0   && stop_count == 0     )
   {
       if ( dtriger == - 1 &&  lpos_type != POSITION_TYPE_SELL )
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   11111
      }
      
       if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count> 0 )
   {
       if (lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == - 1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

       if (lpos_type== POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if (pos_count> 0 && stop_count> 0 ) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return ( false ) ;
     
     if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0 )
       return ( false );
      
     return ( true );
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed ( string symbol, int fill_type)
{ 
   int filling = ( int ) SymbolInfoInteger (symbol, SYMBOL_FILLING_MODE ); 
 
   return ((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for ( int index = PositionsTotal ()- 1 ; index >= 0 ; index--)
   {
       if (o_position.SelectByIndex(index))
      {
         if (o_position. Symbol () == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
     for ( int i = OrdersTotal () - 1 ; i >= 0 ; i-- ) 
   {
       if (o_order.SelectByIndex(i))
         if (o_order. Symbol () == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
파일:
Stend_t1.mq5  12 kb
 
Igor Makanu :

C ++에 관한 책을 적어도 몇 권 읽기 시작하십시오. 귀하의 질문은 두뇌 폭발입니다. 기술 용어를 작성하십시오. 언뜻보기에는 특정 질문을하는 것처럼 보이지만 실제로는 본질을 이해하지 않고 용어로 작동합니다 .. .. 매크로는 무엇을 반환합니까? 어디로 돌아올 것인가? 매크로 본문에 다시 로드할 수 있는 기능이 있습니다.... 귀하의 질문이 어떻게 생겼는지 설명할 수도 없습니다.

매크로가 무엇인지 이해하려면 매크로 SUBSTITUTION이라는 용어를 올바르게 작성하십시오. 매크로가 무엇인지 이해하는 것이 더 쉬울 것입니다.

mql4에서는 C++의 가능성도 축소되었습니다. 즉, 언어가 너무 정적입니다. 우리는 내 아이디어가 실패했다고 말할 수 있습니다. 클래스없이 간단한 오버로드를 작성하고 인수를 추가하고 0을 할당했습니다. 매크로를 호출하려고 시도했지만 3 가지 기능이 있다는 오류가 발생했습니다. 당신은 여전히 어떤 돌을 불러야 할지 그리고 내가 나중에 어떤 돌을 만날 것인지에 대해 침묵하는 방법을 칠해야 한다는 것이 밝혀졌습니다. 아마 아무것도 하지 않는 것이 더 나을 것입니다. 그러면 잘못될 수 없습니다.

 
Seric29 :

mql4에서는 C++의 가능성도 축소되었습니다. 즉, 언어가 너무 정적입니다.

구체적으로 무엇을 잘랐습니까?

즉, 필요하지 않습니다. 특히 Google조차도 " 너무 정적인 언어"를 모르기 때문에 C ++는 처음에는 정적으로 유형이 지정된 언어이고 생각은 단순히 의미가 없습니다. 그냥 그렇습니다.

Seric29 :

아마 아무것도 하지 않는 것이 더 나을 것입니다. 그러면 잘못될 수 없습니다.

간략한 RTFM( lurkmore )

 

순전히 미학적 질문입니다.

여기에서 어떻게 나만의 그림을 만들 수 있습니까? MT4