[경고, 주제 닫힘!] 포럼을 어지럽히지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 당신 없이는 어디에도 없습니다. - 페이지 842

 
귀하의 주문 수정은 개시와 동일한 블록에 있고 그 상태는 주문 없음입니다. 방금 주문을 열고 즉시 수정하려고 시도했지만 5 pp의 이익은 어디에서 오는 것입니까?
 

안녕하세요! 최근에 이동평균선에 관심을 갖게 되었습니다. 거래를 위한 이동 및 조건의 특정 조합을 찾았고 수익성이 있는지 없는지 여부를 확인하고 최적화하기로 결정했습니다. 그러나 테스트 중에 작성한 고문은 거래를 열지 않습니다. 나는 저녁 내내 괴로움을 겪었고 해결책을 찾지 못해 친애하는 프로그래머에게 묻기로 결정했습니다. 어드바이저의 작동 방식을 이해하기 위해 내 TS를 간략하게 설명하겠습니다. EMA(13) 및 EMA(55) 차트에서 막대가 EMA(13)를 교차하고 모든 후속 막대가 EMA(13) 위/아래에 있는 경우 그런 다음 가격이 MA(13)에 닿으면 이전 막대가 위치한 방향으로 포지션을 엽니다(교차 후 + 9 이상 23 이하). 이익 60핍, 손절매 = EMA(55) 플러스 또는 마이너스 5핍. 그것이 실제로 전체 전략입니다. 더 명확하게 하기 위해 다음과 같은 예를 게시했습니다.

어드바이저 코드는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                          DWM.mq4 |
//|                                 Copyright © 2010, Bobkov Vasiliy |
//|                                          http://www.forex4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Bobkov Vasiliy"
#property link      "http://mql4.com"
extern double Lot= 0.1 ;
extern int FastMA= 13 ;         //Быстрая МА
extern int SlowMA= 54 ;         //МедленнаяМА
extern int TP= 60 ;             //Тейк профит
extern int MinBars= 8 ;         //Минимальное кол-во баров вне МА
extern int MaxBars= 25 ;        //Максимальное кол-во баров вне МА
extern int slippage= 3 ;        //Слипадж
extern int Magic= 347586 ;      //Магическое число
extern int Space= 10 ;          //Отступ от МА при тралле ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (OrderCheck()==true)                                        //Проверяем, есть ли ордер...
   {                                                           //...если ордер есть...
   Trall();                                                    //Траллим
   return ( 0 );
   }
else                                                           //...если нет открытых позиций то...
   {
   double FMA=MA( 0 );
   double SMA= iMA ( NULL , 0 ,SlowMA, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   for ( int x= 1 ;;x++)                                          //Вычесляем сколько баров вне МА...
      {
      if (MA(x)<High[x]&& MA(x)>Low[x]) break ;
      }
   if (Bid==FMA && x>MinBars && x<MaxBars)                     //Если условия выполняются, то...
      {
      if (FMA>SMA ) OrdOpen( 0 ,SMA);                            //...открывем сделку на покупку
      if (FMA<SMA) OrdOpen( 1 ,SMA);                             //...или на продажу
      }
   }   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

bool OrderCheck()                                              //Функция проверки позиций
   {
   for ( int i= 1 ;i<= OrdersTotal ();i++)
      {
      if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderSymbol()== Symbol () && OrderMagicNumber()==Magic) return (true);
         }
      else
         Print ( "OrderSelect() вернул ошибку - " , GetLastError ());
          
      }
    return (false);
   }

void OrdOpen( int type, double SO)                               //Функция открытия позиций
   {
   if (type== 0 ) 
      {
      if ( OrderSend ( Symbol (), 0 ,Lot,Ask,slippage,SO-Space* Point ,Ask+TP* Point , NULL ,Magic, 0 , Blue )==true) return ;
      else Print ( "OrderSend() вернул ошибку - " , GetLastError ());
      }
   else 
      {
      if ( OrderSend ( Symbol (), 0 ,Lot,Bid,slippage,SO+Space* Point ,Bid-TP* Point , NULL ,Magic, 0 , Blue )==true) return ;
      else Print ( "OrderSend() вернул ошибку - " , GetLastError ());
      }
   return ;
   }
   
void Trall()                                                    //Трейллинг стоп
   {
   if ( OrderSelect (Magic,SELECT_BY_TICKET)==true)
      {
      double SL= iMA ( NULL , 0 ,SlowMA, 0 , MODE_EMA , PRICE_CLOSE , 0 );
      if (Bid< iMA ( NULL , 0 ,SlowMA, 0 , MODE_EMA , PRICE_CLOSE , 0 )) SL=SL+Space* Point ;
      else SL=SL-Space* Point ;
      if (OrderModify(OrderTicket(),OrderOpenPrice(), NormalizeDouble (SL, Digits ),OrderTakeProfit(), 0 , Blue )==true) return ;
      else Print ( "OrderModify() вернул ошибку - " , GetLastError ());
      }
   return ;
   }
double MA( int m)                                                  //Функция возвращающая значение МА
   {
   return ( iMA ( NULL , 0 ,FastMA,m, MODE_EMA , PRICE_CLOSE , 0 ));
   }

누구든지 도와주세요. 나는 또한 조언자를 직접 게시합니다.

파일:
dwm.mq4  5 kb
 

하나의 for 루프에는 위치 열기, 변경, 닫기 등을 위한 많은 기능이 포함될 수 있습니다.

다음은 간단한 예입니다.

             bool Ans=OrderModify(Ticket,Price,SL,TP, 0 );
             if (Ans== true ) {
               Alert ( "Ордер " ,Text,Ticket, " модифицирован:)" );
               break ;                           // Из цикла модифи.
            }

- 질문: 여기에서 "return" 대신 "break"를 사용하는 것이 맞습니까? 차이가 있습니까?

 
chief2000 :

하나의 for 루프에는 위치 열기, 변경, 닫기 등을 위한 많은 기능이 포함될 수 있습니다.

다음은 간단한 예입니다.

- 질문: 여기에서 "return"이 아니라 "break"를 사용하는 것이 맞습니까? 차이가 있습니까?

https://docs.mql4.com/en/basis/operators/break 에서:
" break 문은 가장 가까운 중첩 외부 스위치, while 또는 for 문의 실행을 종료합니다. 제어는 종료되는 문 다음의 문으로 이전됩니다."

https://docs.mql4.com/ru/basis/operators/return 에서:
" return 문 은 현재 함수의 실행을 종료하고 호출 프로그램에 제어를 반환합니다."

답변: 여기서 "break"를 사용하는 것이 맞습니다.

 
abolk :

https://docs.mql4.com/en/basis/operators/break 에서:
" break 문은 가장 가까운 중첩 외부 스위치, while 또는 for 문의 실행을 종료합니다. 제어는 종료되는 문 다음의 문으로 이전됩니다."

https://docs.mql4.com/ru/basis/operators/return 에서:
" return 문 은 현재 함수의 실행을 종료하고 호출 프로그램에 제어를 반환합니다."

답변: 여기서 "break"를 사용하는 것이 맞습니다.

일반적으로 나 자신은 break를 사용하지만 return은 틱 변경을 의미한다고 생각했습니다(그리고 break는 그렇지 않습니다).

실제로 순서가 변경되는 동안 틱 변경이 있으므로 테스터가 상황을 올바르게 모델링하려면

반환을 사용해야 합니다. 권리?

제가 틀렸을 수도 있지만 이해하고 싶습니다.

 
chief2000 :

일반적으로 나 자신은 break를 사용하지만 return은 틱 변경 을 의미한다고 생각했습니다(그리고 break는 그렇지 않습니다).

실제로 순서가 변경되는 동안 틱 변경이 있으므로 테스터가 상황을 올바르게 모델링하려면

반환을 사용해야 합니다. 권리?

제가 틀렸을 수도 있지만 이해하고 싶습니다.

" return 문현재 함수 의 실행을 종료하고 호출 프로그램에 제어를 반환합니다."

현재 함수가 start() 이면 다시 문서에서 읽습니다.

https://docs.mql4.com/ru/runtime/start
"새 견적이 도착하면 첨부된 Expert Advisors 및 사용자 지정 표시기에 대해 start() 함수가 실행됩니다. 새 견적이 도착할 때 이전 견적에서 시작된 start() 함수가 실행된 경우 들어오는 견적은 무시됩니다. 프로그램 실행 중에 수신된 모든 새로운 인용문은 다음 start() 함수의 실행이 완료될 때까지 프로그램에서 무시됩니다. 그 이후에는 start() 함수가 도착한 후에만 시작됩니다. 다음 새 견적."

 
abolk :

" return 문현재 함수 의 실행을 종료하고 호출 프로그램에 제어를 반환합니다."

현재 함수가 start() 이면 다시 문서에서 읽습니다.

https://docs.mql4.com/ru/runtime/start
"새 견적이 도착하면 첨부된 Expert Advisors 및 사용자 지정 표시기에 대해 start() 함수가 실행됩니다. 새 견적이 도착할 때 이전 견적에서 시작된 start() 함수가 실행된 경우 들어오는 견적은 무시됩니다. 프로그램 실행 중에 수신된 모든 새로운 인용문은 다음 start() 함수의 실행이 완료될 때까지 프로그램에서 무시됩니다. 그 이후에는 start() 함수가 도착한 후에만 시작됩니다. 다음 새 견적."

본인 말로 쓰시면 더 좋을텐데.. 무슨말인지 이해가 잘 안가네요.

테스터에서 for가 중단된 후 다른 기능이 종료되면 동일한 틱에서 실행됩니다. 그러나 실제 생활에서는 이 시간 동안(순서가 수정되는 동안) 여러 틱이 변경될 수 있습니다. 그래서 나는 그 반환이 더 실제적인 행동을 반영한다고 생각합니다. 그렇지 않습니까?

 
chief2000 :

본인 말로 쓰시면 더 좋을텐데.. 무슨말인지 이해가 잘 안가네요.

for가 중단으로 끝나고 다른 함수가 뒤에 오는 경우 동일한 틱에서 실행됩니다. 그러나 실제 생활에서는 이 시간 동안(순서가 수정되는 동안) 여러 틱이 변경될 수 있습니다. 그래서 나는 그 반환이 더 실제적인 행동을 반영한다고 생각합니다. 그렇지 않습니까?


start()는 틱의 시작 부분과 함께 작업을 시작하고 다음 틱이 시작될 때까지 작업이 완료되지 않을 수 있습니다.

break는 for를 종료하고 return은 함수를 종료합니다. for 뒤에 연산자가 없으면 이 알고리즘에 대해 for와 return을 사용하는 데 차이가 없습니다.

그러나 각 연산자에는 목적이 있습니다. 그리고 오퍼레이터의 오용은 장전되지 않은 총과 같습니다.

다시, for 루프의 알고리즘에 따르면 어떤 이유로 함수를 계속 실행할 필요가 없으므로 return을 사용할 수 있습니다.

즉, 알고리즘에 따라 주기를 중단해야 하는 경우 함수가 주기 후에 종료되더라도 중단이 설정됩니다.

 
abolk :


start()는 틱의 시작 부분과 함께 작업을 시작하고 다음 틱이 시작될 때까지 작업이 완료되지 않을 수 있습니다.

break는 for를 종료하고 return은 함수를 종료합니다. for 뒤에 연산자가 없으면 이 알고리즘에 대해 for와 return을 사용하는 데 차이가 없습니다.

그러나 각 연산자에는 목적이 있습니다. 그리고 오퍼레이터의 오용은 장전되지 않은 총과 같습니다.

다시, for 루프의 알고리즘에 따르면 어떤 이유로 함수를 계속 실행할 필요가 없으므로 return을 사용할 수 있습니다.

다시 말해, 알고리즘에 따라 주기를 중단해야 하는 경우 함수가 주기 후에 종료되더라도 중단이 설정됩니다.

이 모든 것이 테스터만을 위해 시작된 것이기 때문에 필요한 경우 다음을 수행하는 것이 가능하다는 생각이 들었습니다.

 if (IsTesting()== true    ||   IsOptimization()== true ) {
   return ;
}

break ;

고맙습니다!

 
chief2000 :

이 모든 것이 테스터만을 위해 시작된 것이기 때문에 필요한 경우 다음을 수행하는 것이 가능하다는 생각이 들었습니다.

고맙습니다!


~할 수 있다