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

 
Alexey Belyakov :

따라서? 아니면 OnInit에서 다른 것을 선언해야 합니까?

아니요, OnInit에서는 기본적으로 모든 줄이 이미 숨겨져 있습니다.

 int OnInit () {
  hLine.Create( 0 , "hLine" , 0 , 0 );
  hLine.Color( clrDarkViolet );
  lLine.Create( 0 , "lLine" , 0 , 0 );
  lLine.Color( clrDodgerBlue );
   return ( INIT_SUCCEEDED );
}
 
Mihail Matkovskij :

아니요, OnInit에서는 기본적으로 모든 줄이 이미 숨겨져 있습니다.

어떤 이유로 조건이 무시되고 있습니다. 내가 포지션을 여는 것에 베팅하더라도.

PRL 변수를 잡아당겨 조건에 넣을 수 없습니다.


 if (c0<PRL)  
{
MqlTradeRequest request ={ 0 };
MqlTradeResult   result= { 0 };
      request.action   = TRADE_ACTION_DEAL ;                         // тип торговой операции
      request.symbol   = Symbol ();                                 // символ
      request.volume   = 1 ;                                       // объем в 1 лот
      request.type     = ORDER_TYPE_SELL ;                         // тип ордера
      request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_ASK ); // цена для открытия
      request.deviation= 3 ;
      request.sl    = NormalizeDouble (Bid+ 50 * _Point , _Digits );
      request.tp    = NormalizeDouble (Bid- 50 * _Point , _Digits );
       if (! OrderSend (request,result))
         PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки

어떻게 든 GlobalVariableGet을 사용하여 꺼내려고합니다. 하지만 왠지 의심스러운...

안에 조건을 넣어도. 이미 최저 가격이 유지되고 있습니다. 모두 같은 완고하게 위치를 열고 싶지 않습니다.


 //+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version    "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit () {
  hLine.Create( 0 , "hLine" , 0 , 0 );
  hLine.Color( clrDarkViolet );
  lLine.Create( 0 , "lLine" , 0 , 0 );
  lLine.Color( clrDodgerBlue );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick () {
   double    o1 = iOpen ( NULL , PERIOD_CURRENT , 1 );
   double    h1 = iHigh ( NULL , PERIOD_CURRENT , 1 );
   double    l1 = iLow ( NULL , PERIOD_CURRENT , 1 );
   double    c1 = iClose ( NULL , PERIOD_CURRENT , 1 );
   double    c0 = iClose ( NULL , PERIOD_CURRENT , 0 );
   double    rt = 0 ;
   double    rs1 = 0 ;
   double    rs2 = 0 ;
   double    PRH= 0 ;
   double    PRL= 0 ;
   double    Ask= SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
   double   Bid= SymbolInfoDouble ( _Symbol , SYMBOL_BID );

  rt= MathAbs (c1 - o1) / Point (); //размер тела свечи
  rs1= MathAbs (h1 - c1) / Point (); // размер верхней тени свечи
  rs2= MathAbs (l1 - c1) / Point (); // размер нижней тени свечи

   if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh ( NULL , PERIOD_CURRENT , 1 ); // то это будет максимум
    hLine.Price( 0 , PRH);
  }
  
if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
PRL = iLow ( NULL , PERIOD_CURRENT , 1 );
lLine.Price( 0 , PRL);
 
  
  
   // double a=GlobalVariableGet("i",PRL); 
Comment ( " =======" ,PRL, "\n" );

if (c0<PRL)  
{
MqlTradeRequest request={ 0 };
MqlTradeResult   result={ 0 };
      request.action   = TRADE_ACTION_DEAL ;                         // тип торговой операции
      request.symbol   = Symbol ();                                 // символ
      request.volume   = 1 ;                                       // объем в 1 лот
      request.type     = ORDER_TYPE_SELL ;                         // тип ордера
      request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_ASK ); // цена для открытия
      request.deviation= 3 ;
      request.sl    = NormalizeDouble (Bid+ 50 * _Point , _Digits );
      request.tp    = NormalizeDouble (Bid- 50 * _Point , _Digits );
       if (! OrderSend (request,result))
         PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки;
}
}
}
//+------------------------------------------------------------------+
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Alexey Belyakov :

어떤 이유로 조건이 무시되고 있습니다. 내가 포지션을 여는 것에 베팅하더라도.

PRL 변수를 잡아당겨 조건에 넣을 수 없습니다.


PRL, 오프셋이 1인 Low입니다.
PRL = iLow ( NULL , PERIOD_CURRENT , 1 );
PRH, 오프셋 1로 높음
PRH = iHigh ( NULL , PERIOD_CURRENT , 1 );

다음 그림이 나옵니다.

 void OnTick () {
   double    o1 = iOpen ( NULL , PERIOD_CURRENT , 1 );
   double    h1 = iHigh ( NULL , PERIOD_CURRENT , 1 ) ;
   double    l1 = iLow ( NULL , PERIOD_CURRENT , 1 );
   double    c1 = iClose ( NULL , PERIOD_CURRENT , 1 );
   double    c0 = iClose ( NULL , PERIOD_CURRENT , 0 );
   double    rt = 0 ;
   double    rs1 = 0 ;
   double    rs2 = 0 ;
   double    PRH;
   double    PRL;

  rt= MathAbs (c1 - o1) / Point (); //размер тела свечи
  rs1= MathAbs (h1 - c1) / Point (); // размер верхней тени свечи
  rs2= MathAbs (l1 - c1) / Point (); // размер нижней тени свечи

   if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh ( NULL , PERIOD_CURRENT , 1 ); // то это будет максимум
    hLine.Price( 0 , PRH);
  }
  
   if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
    PRL = iLow ( NULL , PERIOD_CURRENT , 1 );
    lLine.Price( 0 , PRL);  
  }
}

따라서 PRL 대신 iLow(NULL, PERIOD_CURRENT, 1) 또는 l1을 사용할 수 있습니다 .

나는 당신이 코드 작성에 관심이 없고 당신이 하는 일을 이해하지 못한다는 인상을 받았습니다. 약간의 인내심과 당신은 쉽게 모든 것을 알아낼 수 있습니다. 코드에 순서를 지정하면 많은 질문이 저절로 사라집니다. 무엇이 잘못되었는지 이해할 수 없다면 프로그래머를 위한 매우 강력한 도구인 디버깅도 있습니다. 당신이하고있는 일을 이해하고 질문을하십시오.

 
Alexey Belyakov :

어떤 이유로 조건이 무시됩니다. 내가 포지션을 여는 것에 베팅하더라도.

PRL 변수를 잡아당겨 조건에 넣을 수 없습니다.


어떻게 든 GlobalVariableGet을 사용하여 꺼내려고합니다. 하지만 왠지 의심스러운...

안에 조건을 넣어도. 이미 최저 가격이 유지되고 있습니다. 모두 같은 완고하게 위치를 열고 싶지 않습니다.


글쎄, 왜 먼저 하나의 메시지를 작성한 다음 편집합니까?

 
Alexey Belyakov :

어떤 이유로 조건이 무시되고 있습니다. 내가 포지션을 여는 것에 베팅하더라도.

PRL 변수를 잡아당겨 조건에 넣을 수 없습니다.


어떻게 든 GlobalVariableGet을 사용하여 꺼내려고합니다. 하지만 왠지 의심스러운...

안에 조건을 넣어도. 이미 최저 가격이 유지되고 있습니다. 모두 같은 완고하게 입장을 열고 싶지 않습니다.


귀하의 코드에서 알고리즘 자체는 처음에 올바르지 않았고 시장에 진입하기 위한 알고리즘도 잘못되었습니다. 수정했습니다.

 //+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version    "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

double    PRH = 0 ;
double    PRL = 0 ;

double entryPRL = 0 ;
double entryPRH = 0 ;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit () {
  hLine.Create( 0 , "hLine" , 0 , 0 );
  hLine.Color( clrDarkViolet );
  lLine.Create( 0 , "lLine" , 0 , 0 );
  lLine.Color( clrDodgerBlue );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick () {
   double    o1 = iOpen ( NULL , PERIOD_CURRENT , 1 );
   double    h1 = iHigh ( NULL , PERIOD_CURRENT , 1 );
   double    l1 = iLow ( NULL , PERIOD_CURRENT , 1 );
   double    c1 = iClose ( NULL , PERIOD_CURRENT , 1 );
  
   double    c0 = iClose ( NULL , PERIOD_CURRENT , 0 );
  
   double    rt = 0 ;
   double    rs1 = 0 ;
   double    rs2 = 0 ;
  
   double    Ask = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
   double   Bid = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
  
  rt = MathAbs (c1 - o1) / Point (); //размер тела свечи
  rs1 = MathAbs (h1 - c1) / Point (); // размер верхней тени свечи
  rs2 = MathAbs (l1 - c1) / Point (); // размер нижней тени свечи
  
   if ((rs1 >= rt) && (c1 > o1)) { //условия для растущих свечей
    PRH = h1; // то это будет максимум
    hLine.Price( 0 , PRH);
  }
  
   if ((rs2 >= rt) && (c1 < o1)) { //условия для падающих свечей
    PRL = l1;
    lLine.Price( 0 , PRL);
     // double a=GlobalVariableGet("i",PRL);
     Comment ( " =======" , PRL, "\n" );
  }
  
   if (PRL > 0 && c0 < PRL && PRL != entryPRL) {
     MqlTradeRequest request={ 0 };
     MqlTradeResult   result={ 0 };

     request.action   = TRADE_ACTION_DEAL ;                     
     request.symbol   = Symbol ();                          
     request.volume   = 0.1 ;                                   
     request.type     = ORDER_TYPE_SELL ;                       
     request.price    = SymbolInfoDouble ( Symbol (), SYMBOL_BID ); 
     request.deviation= 5 ;                                    
     request.magic    = 0 ;                         

     if ( OrderSend (request,result))
       entryPRL = PRL;
     else
       PrintFormat ( "OrderSend error %d" , GetLastError ());     // если отправить запрос не удалось, вывести код ошибки

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

하지만 이 코드가 실제 거래에서 사용되기 위해서는 많은 개선이 필요할 것입니다...

 
Mihail Matkovskij :

귀하의 코드에서 알고리즘 자체는 처음에 올바르지 않았고 시장에 진입하기 위한 알고리즘도 잘못되었습니다. 수정했습니다.

하지만 이 코드가 실제 거래에서 사용되기 위해서는 많은 개선이 필요할 것입니다...

아주 멋져! 고맙습니다! 여기를 동시에 보니 다중입력 문제가 해결되었습니다. 이제 제대로 작동합니다.
 

수정하는 동안 테스터에 4108(잘못된 티켓)이 어떻게 나타날 수 있습니까? MQL4

 if ( OrdersTotal () > 0 && OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))
     {
       if (OrderType() == OP_BUY && SymbolInfoDouble ( _Symbol , SYMBOL_BID ) >= value_tp1 && !_tps) _tps = OrderClose(ticket,c_lot, SymbolInfoDouble ( _Symbol , SYMBOL_BID ),( int )slippage, clrNONE );
       if (OrderType() == OP_SELL && SymbolInfoDouble ( _Symbol , SYMBOL_ASK ) <= value_tp1 && !_tps) _tps = OrderClose(ticket,c_lot, SymbolInfoDouble ( _Symbol , SYMBOL_ASK ),( int )slippage, clrNONE );
       if (_tps && !sl_mod) sl_mod = OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(), 0 , clrNONE );
     };


 
Alexandr Sokolov :

수정하는 동안 테스터에 4108(잘못된 티켓)이 어떻게 나타날 수 있습니까? MQL4


이미 기록에 있는 주문을 마감하려고 할 가능성이 큽니다. 이미 마감된 주문

SELECT_BY_TICKET 도움말을 보면 주문이 열려 있거나 이미 주문 내역에 있는지 여부에 관계없이 선택합니다.

추신: OrderCloseTime() 확인

 
Igor Makanu :

이미 기록에 있는 주문을 마감하려고 할 가능성이 큽니다. 이미 마감된 주문

SELECT_BY_TICKET 도움말을 보면 주문이 열려 있거나 이미 주문 내역에 있는지 여부에 관계없이 선택합니다.

추신: OrderCloseTime() 확인

따라서 시장에서 무엇을 선택해야 하는지 알려줍니다.

 OrderSelect (ticket,SELECT_BY_TICKET, MODE_TRADES )
OrderSelect - Trade Functions - MQL4 Reference
OrderSelect - Trade Functions - MQL4 Reference
  • docs.mql4.com
To find out from what list the order has been selected, its close time must be analyzed. If the order close time equals to 0, the order is open or pending and taken from the terminal open orders list. One can distinguish an opened order from a pending order by the order type. If the order close time does not equal to 0, the order is a closed...
 
Vitaly Muzichenko :

따라서 시장에서 무엇을 선택해야 하는지 알려줍니다.

나는 당신이 문서를 인용해야한다고 생각하지 않았습니다 ...

메모

티켓 번호로 주문을 선택한 경우 pool 매개변수는 무시됩니다. 티켓 번호는 고유한 주문 식별자입니다.

어떤 목록에서 주문이 선택되었는지 확인하려면 마감 시간을 분석해야 합니다. 주문 마감 시간이 0이면 주문이 열려 있거나 보류 중이며 터미널의 열린 주문 목록에서 가져옵니다.