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

 
Vitaly Muzichenko :

글쎄, 당신은 치명적인 오류를 보여주지 않았습니다.

기능이 작동하는 방식에 대해 스스로 답했습니다.


테스터에서는 정상입니다. 이것이 실제로 일어나는 방식입니다.
파일:
yOXZsAXZ-X4.jpg  479 kb
 
Tigerfreerun :
테스터에서는 정상입니다. 이것이 실제로 일어나는 방식입니다.

음, 이 경우 코드를 처리하고 모든 값을 인쇄( Print (...) )하고 오류가 어디에서 오는지 확인해야 합니다.

 
Tigerfreerun :
테스터에서는 정상입니다. 이것이 실제로 일어나는 방식입니다.

그들은 당신에게 다음과 같이 대답했습니다.

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

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

알렉세이 빅토 로프 , 2018.09.06 21:00

생각하는 방향: 이익이 0보다 작으면... 정렬하는 동안 배열의 크기는 무엇입니까???

그리고 주문이 전혀 없다면 배열의 크기는 얼마입니까???
모든 이익이 0보다 크지 않은 경우 첫 번째 차원에서 정렬된 배열 a[][2]의 크기를 생각하십시오.
 

안녕하세요! Expert Advisor를 롤리폴리라고 하지만 계획대로 작동하지 않습니다. 로트는 빨간색으로 마감되면 두 배가 되지만 어떤 이유로 인해 후속 TP 마감은 이전에 마감된 마이너스 거래의 반환을 허용하지 않습니다. 뭐가 문제인지 말해봐, 난 알아낼 수 없어. 답변해 주시는 모든 분들께 미리 감사드립니다.

 extern string TimeStart    = "04:00" ;   //Время начала контрольного периода
extern string TimeEnd      = "09:00" ;   //Время окончания контрольного периода
extern string TimeCloseOrder = "23:30" ; //Время в которое происходит закрытие всех ордеров
extern double LOT          = 0.1 ;
extern int     Magic        = 777 ;
extern double K_martin     = 2 ;
extern bool    No_Loss      = true ;
int slippage = 3 ;
double marga,Lot,SL,TP;
int tip,Orders,tipOrders,TradeDey;
//-------------------------------------------------------------------+
int init()
{
   if ( Digits == 5 || Digits == 3 ) slippage = 30 ;
}
int start()
{
   datetime Time_Start      = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeStart,     ":00" ));
   datetime Time_End        = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeEnd,       ":00" ));
   datetime Time_CloseOrder = StrToTime ( StringConcatenate ( Day (), "." , Month (), "." , Year (), " " ,TimeCloseOrder, ":00" ));

   if (Time_CloseOrder>Time_End) if ( CurTime ()>=Time_CloseOrder) CLOSEORDERS();

   int tip;
   if (Orders> OrdersTotal ()) tip=CloseOrder();
   Orders= OrdersTotal ();

   if (ORDERS( 0 )== 0 && tip== 0 && ( CurTime ()<Time_CloseOrder || Time_CloseOrder<=Time_End) && TradeDey!= TimeDay ( CurTime ()))
   {
       int BarStart = iBarShift ( NULL , 0 ,Time_Start, false );
       int BarEnd   = iBarShift ( NULL , 0 ,Time_End  , false );
       double Max_Price= iHigh ( NULL , 0 , iHighest ( NULL , 0 , MODE_HIGH ,BarStart-BarEnd,BarEnd));
       double Min_Price= iLow ( NULL , 0 , iLowest ( NULL , 0 , MODE_LOW , BarStart-BarEnd,BarEnd));
   
       if ( TimeCurrent ()>Time_End && ObjectFind ( "bar0" +Time_End)==- 1 )
      {
         ObjectCreate ( "bar0" +Time_End, OBJ_RECTANGLE , 0 , 0 , 0 , 0 , 0 );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_STYLE , STYLE_SOLID );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_COLOR , Blue);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_BACK ,   true );
         ObjectSet    ( "bar0" +Time_End, OBJPROP_TIME1 ,Time_Start);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_PRICE1 ,Max_Price);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_TIME2 ,Time_End);
         ObjectSet    ( "bar0" +Time_End, OBJPROP_PRICE2 ,Min_Price);
      }
      
       if ( Bid >Max_Price) OrderSend ( Symbol (), OP_BUY ,LOT, Bid ,slippage,Min_Price,
         NormalizeDouble ( Ask + Max_Price-Min_Price, Digits ), "BreakdownLevel" ,Magic,Blue);
       if ( Bid <Min_Price) OrderSend ( Symbol (), OP_SELL ,LOT, Bid ,slippage,Max_Price,
         NormalizeDouble ( Bid - Max_Price+Min_Price, Digits ), "BreakdownLevel" ,Magic,Blue);
       return ;
   }
   if (No_Loss) No_Loss();
   if (tip== 1 && TradeDey!= TimeDay ( CurTime ()))
   {
      Lot=Lot*K_martin;
       if (tipOrders== 0 ) OrderSend ( Symbol (), OP_SELL ,Lot, Bid ,slippage,SL,TP, "Nevalyashka" ,Magic,Blue);
       if (tipOrders== 1 ) OrderSend ( Symbol (), OP_BUY ,Lot, Ask ,slippage,SL,TP, "Nevalyashka" ,Magic,Blue);
   }
   return ( 0 );
}
//-------------------------------------------------------------------+
int CloseOrder()
{
   string txt;
   double loss;
   int i= OrdersHistoryTotal ()- 1 ;
   if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )== true )
   {                                     
       if ( OrderSymbol ()== Symbol () && Magic== OrderMagicNumber ())
      {
         tipOrders= OrderType ();
         Lot= OrderLots ();
         loss = MathAbs ( OrderProfit ()/ MarketInfo ( Symbol (), MODE_TICKVALUE )/Lot/K_martin);
         if (tipOrders== 0 )
         {
            TP= NormalizeDouble ( Bid - loss* Point , Digits );
            SL= NormalizeDouble ( Ask + loss* Point , Digits );
         }
         if (tipOrders== 1 )
         {
            SL= NormalizeDouble ( Bid - loss* Point , Digits );
            TP= NormalizeDouble ( Ask + loss* Point , Digits );
         }
         if ( OrderClosePrice ()== OrderTakeProfit () || OrderProfit ()>= 0 ) TradeDey= TimeDay ( CurTime ());
         if ( OrderClosePrice ()== OrderStopLoss ()) return ( 1 );
      }
   }  
   return ( 0 );
}
//+-----------------------------------------------------------------+
int ORDERS( int tip)
{
   int N_Sell,N_Buy;
   for ( int i= 0 ; i< OrdersTotal (); i++)
   {                                               
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true )
      {
         if ( OrderSymbol ()== Symbol () && Magic== OrderMagicNumber ())
         {
             if ( OrderType ()== OP_BUY ) N_Buy++;
             if ( OrderType ()== OP_SELL ) N_Sell++;
         }
      }   
   }
if (tip== 0 ) return (N_Buy+N_Sell);
if (tip== 1 ) return (N_Buy);
if (tip==- 1 ) return (N_Sell);
}                  
//-------------------------------------------------------------------+
void No_Loss()
{
   int tip;
   double TP,OOP;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
   {
       if ( OrderSelect (i, SELECT_BY_POS )== true )
      {
         tip = OrderType ();
         if (tip< 2 && OrderSymbol ()== Symbol ())
         {
             if ( OrderMagicNumber ()!=Magic) continue ;
            TP = OrderTakeProfit ();
            OOP = OrderOpenPrice ();
             if (tip== 0 ) //Bay               
            {  
               if ( OrderStopLoss ()> OrderOpenPrice ()+ Ask - Bid ) return ;
               if ((TP-OOP)/ 2 +OOP<= Bid )
               OrderModify ( OrderTicket (),OOP, NormalizeDouble (OOP+ Ask - Bid , Digits ),TP, 0 ,White);
            }                                         
             if (tip== 1 ) //Sell               
            {                                         
               if ( OrderStopLoss ()< OrderOpenPrice ()- Ask + Bid ) return ;
               if (OOP-(OOP-TP)/ 2 >= Ask )
               OrderModify ( OrderTicket (),OOP, NormalizeDouble (OOP- Ask + Bid , Digits ),TP, 0 ,White);
            } 
         }
      }
   }
}
//------------------------------------------------------------------+
void CLOSEORDERS()
{
   bool error;
   int err;
   while ( true )
   {  error= true ;
       for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
      {                                               
         if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== true )
         {
             if ( OrderSymbol ()!= Symbol ()||Magic!= OrderMagicNumber ()) continue ;
             if ( OrderType ()== OP_BUY )
               error= OrderClose ( OrderTicket (), OrderLots (), Bid , 3 ,CLR_NONE);
             if ( OrderType ()== OP_SELL )
               error= OrderClose ( OrderTicket (), OrderLots (), Ask , 3 ,CLR_NONE);
         }   
      }
       if (!error) {err++; Sleep ( 2000 ); RefreshRates ();}
       if (error || err > 5 ) return ;
   }
}
//-------------------------------------------------------------------+
 
Tigerfreerun :
이 기능이 정확히 무엇을 하는지 잘 모르겠습니다. 그러나 저자가 말했듯이, 임무는 이익이없는 주문을 기호 사이에 유익한 주문으로 덮는 것입니다. 기능을 수정하고 이해하는 데 도움이된다면 기쁠 것입니다.
 void MaxMinProfit()
{
int i, N, MaxTic, MinTic;
double    MinProf= 0 , MaxProf= 0 , OP, g, a[][ 2 ] ;
string MinSym, MaxSym;
ArrayResize (a, 0 );
 
for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) 
  {     
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) 
    { 
     if ( OrderType ()== OP_SELL ||   OrderType ()== OP_BUY )
      {
       OP = NormalizeDouble ( OrderProfit ()+ OrderSwap ()+ OrderCommission (), 2 );
       
       if (MinProf>OP) 
      {
       
          MinProf=OP;
          MinTic= OrderTicket ();
          MinSym= OrderSymbol ();
          
         }
         
       if (OP> 0 ) 
      {
       
          N++;
             ArrayResize (a, N);
            a[N- 1 ][ 0 ]=OP;
            a[N- 1 ][ 1 ]= OrderTicket ();
          
         }
         
         }
         }
         
         }
         
       ArraySort (a, WHOLE_ARRAY , 0 , MODE_DESCEND ); //MODE_ASCEND);
      
       for (i= 0 ; i<Level; i++) 
       {
     
     g+=a[i][ 0 ];
     //int ti=a[i-2][1];
     }
         
         
     
     if (MinProf < 0 && (g+MinProf)>=ProcMax)
      {
       for (i= 0 ; i<Level; i++) 
       {
       if ( OrderSelect (a[i][ 1 ], SELECT_BY_TICKET , MODE_TRADES ))
        {
         //Alert(a[i][1]);
         if ( OrderType ()== OP_BUY )
         {
           OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_BID ), Slip, CLR_NONE);
          }
           if ( OrderType ()== OP_SELL )
           {
           OrderClose ( OrderTicket (), OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK ), Slip, CLR_NONE);
           }
          }
         }
          
          
          
           if ( OrderSelect (MinTic, SELECT_BY_TICKET , MODE_TRADES ))
        {
         if ( OrderType ()== OP_BUY )
         {
           OrderClose (MinTic, OrderLots (), MarketInfo ( OrderSymbol (), MODE_BID ), Slip, CLR_NONE);
          }
           if ( OrderType ()== OP_SELL )
           {
           OrderClose (MinTic, OrderLots (), MarketInfo ( OrderSymbol (), MODE_ASK ), Slip, CLR_NONE);
           }
          }}       
return ;
}

당신은 이해하지 못하며 나는 이 기능이 무엇을 하는지 이해하고 싶지 않습니다. 당신은 그것을 사용합니다. 당신은 당신 자신을 위해 그것을 선택했습니다. 무엇을 위한 것인지 이해하지 못한 채 어떻게 사용할 수 있습니까?

방금 어디서, 어떤 이유로 오류가 발생하는지 말했습니다.

한 가지 더 설명:

1. 배열이 선언되었습니다. 코드에서 녹색으로 강조 표시됩니다. 첫 번째 차원에서 길이가 0인 한. 파란색으로 강조 표시된 선은 이유가 명확하지 않습니다. 배열의 크기를 재설정하면 이를 위한 ArrayFree() 가 존재하지만 새로 선언된 동적 배열의 길이가 0이기 때문에 이 함수도 무용지물이다.

2. 주문이 없으면 빨간색으로 강조 표시된 코드는 실행되지 않습니다. 따라서 배열의 크기는 0으로 유지됩니다.

3. 각 틱별로 배열의 정렬이 제공됩니다. 이것은 코드에서 따온 것입니다... 그리고 빈 주머니에 무엇을 분류할 수 있나요??? 메추리알 2개인가...


그리고 여기에 오류의 텍스트가 있습니다 ... 글쎄, 내가 무엇을 말할 수 있습니까? 개발자는 누군가가 빈 배열을 정렬하려고 할 수 있다는 것을 예상하지 못했습니다. 이에 대한 특별한 메시지는 없습니다.

ArrayFree - Операции с массивами - Справочник MQL4
ArrayFree - Операции с массивами - Справочник MQL4
  • docs.mql4.com
При написании скриптов и индикаторов необходимость в использовании функции ArrayFree() может возникнуть не часто: так как при завершении работы скрипта вся использованная память сразу же освобождается, а в пользовательских индикаторах основная работа с массивами представляет собою доступ к индикаторным буферам, размеры которых автоматически...
 
Alexey Viktorov :

당신은 이해하지 못하며 나는 이 기능이 무엇을 하는지 이해하고 싶지 않습니다. 당신은 그것을 사용합니다. 당신은 당신 자신을 위해 그것을 선택했습니다. 무엇을 위한 것인지 이해하지 못한 채 어떻게 사용할 수 있습니까?

방금 어디서, 어떤 이유로 오류가 발생하는지 말했습니다.

한 가지 더 설명:

1. 배열이 선언되었습니다. 코드에서 녹색으로 강조 표시됩니다. 첫 번째 차원에서 길이가 0인 한. 파란색으로 강조 표시된 선은 이유가 명확하지 않습니다. 배열의 크기를 재설정하면 이를 위한 ArrayFree() 가 존재 하지만 새로 선언된 동적 배열의 길이가 0이기 때문에 이 함수도 무용지물이다.

2. 주문이 없으면 빨간색으로 강조 표시된 코드는 실행되지 않습니다. 따라서 배열의 크기는 0으로 유지됩니다.

3. 각 틱별로 배열의 정렬이 제공됩니다. 이것은 코드에서 따온 것입니다... 그리고 빈 주머니에 무엇을 분류할 수 있나요??? 메추리알 2개인가...


그리고 여기에 오류의 텍스트가 있습니다 ... 글쎄, 내가 무엇을 말할 수 있습니까? 개발자는 누군가가 빈 배열을 정렬하려고 할 수 있다는 것을 예상하지 못했습니다. 이에 대한 특별한 메시지는 없습니다.

알렉시스는 옳지 않습니다. ArrayFree()는 이 배열이 더 이상 필요하지 않은 경우 배열에서 메모리를 해제하는 데 사용됩니다. 이는 매우 드물게 필요하며 이 경우에는 확실히 아닙니다.

배열을 0으로 만들려면 ZeroMemory(a), ArrayInitialize(a,xxx)를 사용하고 첫 번째 차원인 ArrayResize(a,xxx)의 크기를 변경해야 합니다.

그러나 이 수정 사항은 귀하의 추론 과정에 영향을 미치지 않으며 정확합니다.

 
Artyom Trishkin :

알렉시스는 옳지 않습니다. ArrayFree()는 이 배열이 더 이상 필요하지 않은 경우 배열에서 메모리를 해제하는 데 사용됩니다. 이는 매우 드물게 필요하며 이 경우에는 확실히 아닙니다.

배열을 0으로 만들려면 ZeroMemory(a), ArrayInitialize(a,xxx)를 사용하고 첫 번째 차원인 ArrayResize(a,xxx)의 크기를 변경해야 합니다.

그러나 이 수정 사항은 귀하의 추론 과정에 영향을 미치지 않으며 정확합니다.

문서에 따르면

어레이 프리

동적 배열의 버퍼를 해제하고 null 차원의 크기를 0으로 설정합니다.

제가 표현을 잘 못해서 오해를 하신건지도 모르겠네요.
 
Alexey Viktorov :

문서에 따르면

제가 표현을 잘 못해서 오해를 하셨나봐요.

그리고 더 나아가:


메모

스크립트 및 표시기를 작성할 때 ArrayFree() 함수를 사용할 필요가 자주 발생하지 않을 수 있습니다. 스크립트가 종료되면 사용된 모든 메모리가 즉시 해제되고 사용자 지정 표시기에서 배열에 대한 주요 작업은 표시기 버퍼에 대한 액세스이며, 크기는 실행 중인 터미널 하위 시스템에 의해 자동으로 제어됩니다.

프로그램이 복잡한 동적 조건에서 메모리를 독립적으로 관리해야 하는 경우 ArrayFree() 함수를 사용하면 이미 불필요한 동적 배열이 차지하고 있는 메모리를 명시적으로 즉시 해제할 수 있습니다.


동적 배열의 버퍼를 해제 하고 null 차원의 크기를 0으로 설정합니다.

이해하다? 두 번째 부분 을 읽었지만 첫 번째 중요한 부분을 놓쳤습니까? 어레이에 할당된 메모리를 해제합니다. It's all ... no ... 어레이에 할당된 메모리 공간이 해제되고 다른 데이터가 차지할 수 있습니다. 이 배열 아래에 메모리를 재할당하기 위해 새로운 함수의 입력에서 매번 어떻게 됩니까? 결국, 당신은 그것을 공개할 것을 제안합니다. 그리고 크기를 변경하기만 하면 됩니다 - ArrayResize() 또는 배열 재설정 - ArrayInitialize(), ZeroMemory(). 이 경우 어레이의 메모리 공간은 해제되지 않고 프로그램이 종료될 때까지 이 어레이용으로 예약된 상태로 유지됩니다.

 
Artyom Trishkin :

그리고 더 나아가:


메모

스크립트 및 표시기를 작성할 때 ArrayFree() 함수를 사용할 필요가 자주 발생하지 않을 수 있습니다. 스크립트가 종료되면 사용된 모든 메모리가 즉시 해제되고 사용자 지정 표시기에서 배열에 대한 주요 작업은 표시기 버퍼에 대한 액세스이며, 크기는 실행 중인 터미널 하위 시스템에 의해 자동으로 제어됩니다.

프로그램이 복잡한 동적 조건에서 메모리를 독립적으로 관리해야 하는 경우 ArrayFree() 함수를 사용하면 이미 불필요한 동적 배열이 차지하고 있는 메모리를 명시적으로 즉시 해제할 수 있습니다.


동적 배열의 버퍼를 해제 하고 null 차원의 크기를 0으로 설정합니다.

이해하다? 두 번째 부분 을 읽었지만 첫 번째 중요한 부분을 놓쳤습니까? 어레이에 할당된 메모리를 해제합니다. It's all ... no ... 어레이에 할당된 메모리 공간이 해제되고 다른 데이터가 차지할 수 있습니다. 이 배열 아래에 메모리를 재할당하기 위해 새로운 함수의 입력에서 매번 어떻게 됩니까? 결국, 당신은 그것을 공개할 것을 제안합니다. 그리고 크기를 변경하기만 하면 됩니다 - ArrayResize() 또는 배열 재설정 - ArrayInitialize(), ZeroMemory(). 이 경우 어레이의 메모리 공간은 해제되지 않고 프로그램이 종료될 때까지 이 어레이용으로 예약된 상태로 유지됩니다.

음, 음... 그리고 함수에 대한 각 호출에서 로컬 배열이 선언되거나 가장 가능성이 낮은 경우 각 틱에서... 글쎄, 배열의 메모리는 각 배열 선언에서 할당됩니다. 안 그래? 그리고 메모리를 해제하거나 하지 않고 매번 메모리를 재할당하는 것은 어떤 차이가 있습니까?

주요 메시지는 이 작업을 수행할 필요가 없다는 것입니다... 그렇게 하면 ArrayFree() 를 사용하여 수행하는 것이 좋습니다.

흥미로운 점은 다음과 같습니다. 함수가 호출될 때마다 로컬 배열이 선언되면 매번 메모리가 예약됩니다. 그리고 어떤 주소가 사용됩니까??? 배열의 첫 번째 선언과 동일합니다. 아니면 어떻게 될까요?

 
Denis Danilov :

안녕하세요! Expert Advisor를 롤리폴리라고 하지만 계획대로 작동하지 않습니다. 로트는 빨간색으로 마감되면 두 배가 되지만 어떤 이유로 인해 후속 TP 마감은 이전에 마감된 마이너스 거래의 반환을 허용하지 않습니다. 뭐가 문제인지 말해봐, 난 알아낼 수 없어. 답변해 주시는 모든 분들께 미리 감사드립니다.

초기 로트 크기보다 더 빨리 배가되는지 확인하십시오. 마감 시간을 참조하십시오.