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

 
trader781 :
신속하게 수행하면 마지막으로 수익성이없는 것이 주어질 것입니다. 어떻게해야하는지 그리고 스스로 수정해야 할 매개 변수는 무엇인지 알아낼 것입니다.

감사합니다 해결했습니다..

이익을 취한 후 로트를 원래 가치로 되돌리려면 어떻게 해야 합니까?

if ( OrderProfit ()> 0 && OrderType ()< 2 )
            {
            lot= 0.1
            }
작동하지 않습니다)
 
wishmast :

감사합니다 해결했습니다..

이익을 취한 후 로트를 원래 가치로 되돌리려면 어떻게 해야 합니까?

if ( OrderProfit ()> 0 && OrderType ()< 2 )
            {
            lot= 0.1
            }
작동하지 않습니다)

나는 계획이있다

if (OrdersTotal()==0)

{

오리지널 로트로 오픈

}

또 다른

...

즉, 주문이 없으면 이전 로트가 더 이상 열리지 않습니다.

물론, 당신은 각각을 암기 할 수 있지만 어떻게하는지 말하지 않습니다.
 
Vitalie Postolache :
지정된 임계값에 도달하면 카운터를 시작하고 초기 값으로 재설정해야 합니다.

고맙습니다.

문제를 해결하는 데 도움이 됩니다.
3개의 매수 포지션이 있고 매도 포지션이 나타났습니다 . 매도 포지션 과 가장 오래된 매수 포지션을 청산해야 합니다. 2개의 매수 포지션이 남아 있어야 합니다.
나는 모든 것을 닫았습니다.

void OnTick ()
  {
//---
int b_STOP,s_STOP,b= 0 ,s= 0 ;

   for ( int i= 0 ; i< OrdersTotal (); i++)
    {
     if ( OrderSelect (i, SELECT_BY_POS )== true )
      {  
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
         if ( OrderType ()== OP_BUY ) b++;
         if ( OrderType ()== OP_SELL ) s++;
         if ( OrderType ()== OP_BUYSTOP ) b_STOP++;
         if ( OrderType ()== OP_SELLSTOP ) s_STOP++;      
      }  
     if ( OrderType ()== OP_BUY )
     {
     if (b>= 1 &&s== 1 ) //бай позиций больше или 1 и появилась SELL позиция
     {
       OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Bid , Digits ), 3 ,CLR_NONE);
      CLOSEORDER( OP_SELL );
     }
     }
    }
  }

 

OrderProfit()<0 함수가 작동하지 않는 이유를 설명할 수 있습니까?

   for ( int q= OrdersHistoryTotal ()- 1 ; q>= 0 ; q--)
      {
       if ( OrderSelect (q, SELECT_BY_POS , MODE_HISTORY ))
         {
         if ( OrderType ()< 2 && OrderMagicNumber ()==magic)
            {
             if ( OrderProfit ()< 0 )
               {
               if ( DayOfWeek ()== 1 )
                  {
                  day1++;
                   Print ( "Понедельник SL=" ,day1);
                  }
               if ( DayOfWeek ()== 2 )
                  {
                  day2++;
                   Print ( "Вторник SL=" ,day2);
                  }
               }
            }
         }
      
      }

요일에 스톱로스가 몇 개인지 보고 싶어요

for ( int l= OrdersHistoryTotal ()- 1 ; l>= 0 ; l--)
        {
         if ( OrderSelect (l, SELECT_BY_POS , MODE_HISTORY ))
           {
           if ( OrderProfit ()< 0 && OrderType ()< 2 )
              {
              oldticket= OrderTicket ();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot= OrderLots ()* 4 ;
              }
           if ( OrderProfit ()> 0 && OrderType ()< 2 )
              {
              lot= 0.01;
              }
           }
        }

그리고 여기에서 내가 이해하는 것과 같은 이유로 작동하지 않습니다.

 
wishmast :

OrderProfit()<0 함수가 작동하지 않는 이유를 설명할 수 있습니까?

   for ( int q= OrdersHistoryTotal ()- 1 ; q>= 0 ; q--)
      {
       if ( OrderSelect (q, SELECT_BY_POS , MODE_HISTORY ))
         {
         if ( OrderType ()< 2 && OrderMagicNumber ()==magic)
            {
             if ( OrderProfit ()< 0 )
               {
               if ( DayOfWeek ()== 1 )
                  {
                  day1++;
                   Print ( "Понедельник SL=" ,day1);
                  }
               if ( DayOfWeek ()== 2 )
                  {
                  day2++;
                   Print ( "Вторник SL=" ,day2);
                  }
               }
            }
         }
      
      }

요일에 스톱로스가 몇 개인지 보고 싶어요

for ( int l= OrdersHistoryTotal ()- 1 ; l>= 0 ; l--)
        {
         if ( OrderSelect (l, SELECT_BY_POS , MODE_HISTORY ))
           {
           if ( OrderProfit ()< 0 && OrderType ()< 2 )
              {
              oldticket= OrderTicket ();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot= OrderLots ()* 4 ;
              }
           if ( OrderProfit ()< 0 && OrderType ()< 2 )
              {
              lot= 0.01;
              }
           }
        }

그리고 여기에서 내가 이해하는 것과 같은 이유로 작동하지 않습니다.

DayOfWeek()는 서버 의 마지막 알려진 시간의 요일 일련 번호를 반환하기 때문입니다.

그리고 주문이 마감된 요일이 필요합니다. TimeDayOfWeek(OrderCloseTime());

 
Artyom Trishkin :

DayOfWeek()는 서버 의 마지막 알려진 시간의 요일 일련 번호를 반환하기 때문입니다.

그리고 주문이 마감된 요일이 필요합니다. TimeDayOfWeek(OrderCloseTime());

그리고 결과는 마치 ( OrderProfit () < 0 )이 무시되고 루프가 발생하는 것처럼 변수의 값이 큽니다.

2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Вторник SL= 1430208
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Понедельник SL= 963666
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Вторник SL= 1430207
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Понедельник SL= 963665

그리고 많은 주기에 대해? 여기에 잘못 복사하고 if ( OrderProfit ()> 0 && OrderType ()< 2 ) 기호를 수정했지만 이 조건이 없으면 루프가 올바르게 작동하지 않으면 본질이 변경되지 않습니다. 왜 그런 겁니까?

 
wishmast :

그리고 결과는 마치 ( OrderProfit () < 0 )이 무시되고 루프가 발생하는 것처럼 변수의 값이 큽니다.

2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Вторник SL= 1430208
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Понедельник SL= 963666
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Вторник SL= 1430207
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Понедельник SL= 963665

그리고 많은 주기에 대해? 여기에 잘못 복사하고 if ( OrderProfit ()> 0 && OrderType ()< 2 ) 기호를 수정했지만 이 조건이 없으면 루프가 올바르게 작동하지 않으면 본질이 변경되지 않습니다. 왜 그런 겁니까?

day1과 day2는 어디에 선언되어 있습니까?
 
Artyom Trishkin :
day1과 day2는 어디에 선언되어 있습니까?
전역으로, 맨 처음에 OnTick() 함수 앞과 모든 함수 앞에
 
Artyom Trishkin :
day1과 day2는 어디에 선언되어 있습니까?

나는 어떻게 든 그것이 옳지 않다고 생각하고 작동하지 않는 주문을 선택합니다 ( OrderProfit () < 0 ), 내가 필요한 주문을 구체적으로 지정하는 방법. 나는 그가 마지막 주문이 테이크에 의해 닫히고 거기에 다른 사람이 없을 때 왜 주문을 건너뛰는지 이해하지 못합니다. 역사에서 뭔가 다르게 분류할 필요가 있다면 사이클을 구축해야 합니까?

for ( int w= OrdersHistoryTotal ()- 1 ; w>= 0 ; w--)
      {
       if ( OrderSelect (w, SELECT_BY_POS , MODE_HISTORY ))

Expert Advisors는 비슷한 조건의 주기를 가지고 있고 제대로 작동하지만 OrdersTotal () 에 따라 작동하기 때문입니다.

for ( int n= OrdersTotal ()- 1 ;n>= 0 ;n--)            
         {                                          
         if ( OrderSelect (n, SELECT_BY_POS ))            
            {                                        
             if ( OrderMagicNumber ()==magic)                  
               {
               if ( OrderType ()> OP_SELL )
 
sile :
고맙습니다.

문제를 해결하는 데 도움이 됩니다.
3개의 매수 포지션이 있고 매도 포지션이 나타났습니다 . 매도 포지션 과 가장 오래된 매수 포지션을 청산해야 합니다. 2개의 매수 포지션이 남아 있어야 합니다.
나는 모든 것을 닫았습니다.

void OnTick ()
  {
//---
int b_STOP,s_STOP,b= 0 ,s= 0 ;

   for ( int i= 0 ; i< OrdersTotal (); i++)
    {
     if ( OrderSelect (i, SELECT_BY_POS )== true )
      {  
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
         if ( OrderType ()== OP_BUY ) b++;
         if ( OrderType ()== OP_SELL ) s++;
         if ( OrderType ()== OP_BUYSTOP ) b_STOP++;
         if ( OrderType ()== OP_SELLSTOP ) s_STOP++;      
      }  
     if ( OrderType ()== OP_BUY )
     {
     if (b>= 1 &&s== 1 ) //бай позиций больше или 1 и появилась SELL позиция
     {
       OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Bid , Digits ), 3 ,CLR_NONE);
      CLOSEORDER( OP_SELL );
     }
     }
    }
  }

한 주기 내에서는 이 문제가 해결되지 않습니다. 이 주기에서는 삭제할 주문 티켓을 배열에 저장하고 다른 주기에서는 티켓별로 삭제합니다.

또한 중괄호와 혼동을 일으키며 OrderSelect{} 블록 경계 외부의 주문으로 작업하는데 이는 잘못된 것입니다.