포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 1104

 
shtr :

안녕하세요!

왜 주문이 열리지 않는지 알려주실 수 있습니까?

Initu - initovo, 무역 - 거래. 고문을위한 OnTick이 있으며 모든 것을 init에 밀어 넣을 것이 없습니다 ...

그리고 init의 경우 개발자가 특별히 고안한 종료 코드가 있습니다. 사용하지 않는 이유는 무엇입니까?

 
evillive :

Initu - initovo, 무역 - 거래. 고문을위한 OnTick이 있으며 모든 것을 init에 밀어 넣을 것이 없습니다 ...

그리고 init의 경우 개발자가 특별히 고안한 종료 코드가 있습니다. 사용하지 않는 이유는 무엇입니까?

우리는 그것을 사용하지 않습니다. 아마도 초기화 종료 코드에 대해 모르기 때문일 것입니다. 자습서의 예제는 편집기의 형식과 다릅니다. 예를 들어 int start() 함수가 없습니다. 교과서 에 있는 간단한 어드바이저의 예 를 init에 넣었을 때 어떤 이유로 작동했습니다. 그리고 내가 무엇을 썼는지에 상관없이 아무 일도 일어나지 않았습니다. 그래서 2주간의 실험 끝에 전문가에게 의뢰하기로 결정했습니다. 조언 해주셔서 감사합니다!

나는 모든 것을 OnTik에 던졌지만 아무것도 바뀌지 않았습니다.

 
shtr :

우리는 그것을 사용하지 않습니다. 아마도 초기화 종료 코드에 대해 모르기 때문일 것입니다. 자습서의 예제는 편집기의 형식과 다릅니다. 예를 들어 int start() 함수가 없습니다. 교과서에 있는 간단한 어드바이저의 예를 init에 넣었을 때 어떤 이유로 작동했습니다. 그리고 내가 무엇을 썼는지에 상관없이 아무 일도 일어나지 않았습니다. 그래서 2주간의 실험 끝에 전문가에게 의뢰하기로 결정했습니다. 조언 해주셔서 감사합니다!

나는 모든 것을 OnTik에 던졌지만 아무것도 바뀌지 않았습니다.

교과서는 잊어 버리십시오. 오래된 구문에 따라 작성되었으며 그 이후로 많은 것이 변경되었습니다. 터미널 배달의 도움이 가장 관련성이 있으며 코드 기반은 검색하면 새 버전의 MQL에 대한 예제 소스이기도 합니다.

그리고 예전처럼 인터넷에서 모든 코드를 작성하지 않는 것에 대해 포럼을 검색하기 위해 수백 개의 게시물이 이 포럼의 모든 언어로 입력될 것입니다. 그렇지 않은 새 작가가 있을 때마다 독자;)

 
evillive :

교과서는 잊어 버리십시오. 오래된 구문에 따라 작성되었으며 그 이후로 많은 것이 변경되었습니다. 터미널 배달의 도움이 가장 관련성이 있으며 코드 기반은 검색하면 새 버전의 MQL에 대한 예제 소스이기도 합니다.

그리고 예전처럼 인터넷에서 모든 코드를 작성하지 않는 것에 대해 포럼을 검색하기 위해 수백 개의 게시물이 이 포럼의 모든 언어로 입력될 것입니다. 그렇지 않은 새 작가가 있을 때마다 독자;)

고맙습니다!

관련성이 손실 된 오래된 교과서는 즉시 담배를 피워야합니다))

 
shtr :

고맙습니다!

관련성이 손실 된 오래된 교과서는 즉시 담배를 피워야합니다))

그리고 OnTik에 모든 것을 넣을 필요는 없습니다. 거래와 관련된 부분만 OnInit에 남겨두어야 합니다. 매번 포럼의 레이아웃을 변경하는 것이 게으르다).

코드 자체에 관해서는 주기에 대한 질문이 있습니다. 약간 이상합니다. 제 생각에는 중괄호가 충분하지 않습니다...

예, 손익 수준 계산도 잘못 작성되었습니다. 서버는 핍 값이 아닌 정규화된 가격을 보내야 합니다.

 
evillive :

그리고 OnTik에 모든 것을 넣을 필요는 없습니다. 거래와 관련된 부분만 OnInit에 남겨두어야 합니다. 매번 포럼의 레이아웃을 변경하는 것이 게으르다).

코드 자체에 관해서는 주기에 대한 질문이 있습니다. 약간 이상합니다. 제 생각에는 중괄호가 충분하지 않습니다...

예, 손익 수준 계산도 잘못 작성되었습니다. 서버는 핍 값이 아닌 정규화된 가격을 보내야 합니다.

모든 것을 이해했습니다. 감사합니다. 대괄호를 확인하겠습니다. 편집기에서 오류가 발생하지 않았습니다.

책의 예가 왜 효과가 있었나요..? 모든 기능을 철거하고 int start로 시작하는 예제 코드만 삽입했습니다. 오류가 없었고 거래가 열렸습니다.

 
shtr :

모든 것을 이해했습니다. 감사합니다. 대괄호를 확인하겠습니다. 편집기에서 오류가 발생하지 않았습니다.

책의 예가 왜 효과가 있었나요..? 모든 기능을 철거하고 int start로 시작하는 예제 코드만 삽입했습니다. 오류가 없었고 거래가 열렸습니다.

글쎄, 효과가 있었던 것은 거래 될 필요가 없었습니다)))

그리고 int start int는 어드바이저를 위한 새로운 방식의 OnTik이므로 모든 것을 처음부터 OnTik으로 이전해야 했습니다. 또는 귀하의 경우 OnInit에서 OnTik으로.

컴파일러는 구문 오류를 추적하고 논리는 사람을 제외한 누구도 검사하지 않습니다. 특별한 경우에는 코드 작성자도 혼동할 수 있습니다. :)

 
evillive :

글쎄, 효과가 있었던 것은 거래 될 필요가 없었습니다)))

그리고 int start int는 어드바이저를 위한 새로운 방식의 OnTik이므로 모든 것을 처음부터 OnTik으로 이전해야 했습니다. 또는 귀하의 경우 OnInit에서 OnTik으로.

컴파일러는 구문 오류를 추적하고 논리는 사람을 제외한 누구도 검사하지 않습니다. 특별한 경우에는 코드 작성자도 혼동할 수 있습니다. :)

//+----------------------------------------------- --------------------+
//| 3333.mq4 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+----------------------------------------------- --------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#속성 링크 "https://www.mql5.com"
#속성 버전 "1.00"
#속성엄격
외부 int MA_1=5;
외부 int MA_2=20;
외부 int MA_3=80;
외부 정수 TP=100;
외부 int SL=50;
외부 이중 로트=0.1;
문자열 기호;
//+----------------------------------------------- --------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- --------------------+
int OnInit()
{
//---
//---
반환(INIT_SUCCESSED);
}

//+----------------------------------------------- --------------------+
//| 전문적인 초기화 해제 기능 |
//+----------------------------------------------- --------------------+
무효 OnDeinit(const int 이유)
{
//---
}
//+----------------------------------------------- --------------------+
//| 전문가 틱 기능 |
//+----------------------------------------------- --------------------+
무효 OnTick()
{
이중 MA_1_t;
이중 MA_2_t;
이중 MA_3_t;
정수 합계;
정수 위치;
기호=기호();
총=0;
for( pos=1; pos<=OrdersTotal(); pos++)
pos=OrderSelect(pos-1,MODE_TRADES);
if(포지션==0)
MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0);
MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&열기[1]<MA_1_t&&닫기[1]>MA_1_t)
{
이중 stoploss=NormalizeDouble(Ask-SL*Point,Digits);
double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit,"내 주문",16384,0,clrGreen);
반품;
}
if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&열기[1]>MA_1_t&&닫기[1]<MA_1_t)
{
이중 stoploss=NormalizeDouble(SL*포인트 입찰, 자리수);
double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
pos=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,stoploss,takeprofit,"내 주문",16384,0,clrRed);
반품;
}
반품;
}
//---

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

"글쎄, 효과가 있었던 것은 거래 할 필요가 없었습니다)))" 글쎄, Duc, zhysh, 나는 무언가를 직접 쓰고 싶다)))

환자는 조작 후에 정신을 차리지 못했습니다.

 
shtr :

"글쎄, 효과가 있었던 것은 거래 할 필요가 없었습니다)))" 글쎄, Duc, zhysh, 나는 무언가를 직접 쓰고 싶다)))

환자는 조작 후 정신을 차리지 못했습니다.

글쎄, 논리와 수학은 절름발이이며 그렇게 작동하지 않을 것이 분명합니다.

예를 들어, 이 Expert Advisor에 주기가 있는 이유는 무엇입니까? 즉, 주어진 심볼과 마법에 대해 이미 존재하는 주문의 수를 계산해야 하는 이유는 무엇입니까? 그러나 여기에서 볼 수 있는 것은 "카운터"가 나사로 고정되지 않았기 때문에 주기는 아무 것도 계산하지 않으며 계산할 수 없다는 것입니다.)))

Total= 0 ;                                   

   for ( pos= 1 ; pos<= OrdersTotal (); pos++)         
   pos= OrderSelect (pos- 1 ,MODE_TRADES); И что дальше? Переменная pos всегда или 0 , или 1 , цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

OrderSelect() 는 pos 변수에 적합하지 않은 true 또는 false 부울 값을 반환합니다. 그리고 주문을 놓치지 않도록 가장 오래된 순서, 즉 역순으로주기를 계산하는 것이 좋습니다.

카운터로서의 Total 변수는 분명히 여기에서 유용할 것입니다.

 for (pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
{
   if ( OrderSelect (pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
     if (OrderSymbol()== Symbol ()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if (Total< 1 )
{
  торгуем
}

비 ECN 계정의 테스터에 대해 OrderSend 이후에 불필요한 추가 오류 출력을 제거하고 이미 주문을 엽니다.

 #property version    "1.00"
#property strict
extern int MA_1= 5 ;
extern int MA_2= 20 ;
extern int MA_3= 80 ;
extern int TP= 100 ;
extern int SL= 50 ;
extern double Lot= 0.1 ;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
{
  
   double MA_1_t= 0 ;
   double MA_2_t= 0 ; 
   double MA_3_t= 0 ;
   int Total= 0 ;
   
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
   {
     if ( OrderSelect (pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if (OrderSymbol()== Symbol ()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if (Total< 1 )
   {
      MA_1_t= iMA ( NULL , 0 ,MA_1, 0 , MODE_EMA , PRICE_CLOSE , 0 );
      MA_2_t= iMA ( NULL , 0 ,MA_2, 0 , MODE_EMA , PRICE_CLOSE , 0 ); 
      MA_3_t= iMA ( NULL , 0 ,MA_3, 0 , MODE_EMA , PRICE_CLOSE , 0 );
  
       if (MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[ 1 ]<MA_1_t&&Close[ 1 ]>MA_1_t)
      {
         double stoploss= NormalizeDouble (Ask-SL* Point , Digits );
         double takeprofit= NormalizeDouble (Ask+TP* Point , Digits );
         if ( OrderSend ( Symbol (),OP_BUY,Lot,Ask, 6 ,stoploss,takeprofit, "My order buy" , 16384 , 0 , clrGreen )< 1 ) 
         Print ( "OrderSend error #" , _LastError , " BuySL=" ,stoploss, " BuyTP=" ,takeprofit);
      }
    
       if (MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[ 1 ]>MA_1_t&&Close[ 1 ]<MA_1_t)
      {
         double stoploss= NormalizeDouble (Bid+SL* Point , Digits );
         double takeprofit= NormalizeDouble (Bid-TP* Point , Digits );
         if ( OrderSend ( Symbol (),OP_SELL,Lot,Bid, 6 ,stoploss,takeprofit, "My order sell" , 16384 , 0 , clrRed )< 1 )
         Print ( "OrderSend error #" , _LastError , " Sell SL=" ,stoploss, " Sell TP=" ,takeprofit);
      }
   }
}

그리고 네, 판매 SL 레벨 계산이 잘못되었으니 좀 더 주의가 필요합니다.

 
evillive :

글쎄, 논리와 수학은 절름발이이며 그렇게 작동하지 않을 것이 분명합니다.

예를 들어, 이 Expert Advisor에 주기가 있는 이유는 무엇입니까? 즉, 주어진 심볼과 마법에 대해 이미 존재하는 주문의 수를 계산해야 하는 이유는 무엇입니까? 그러나 여기에서 볼 수 있는 것은 "카운터"가 나사로 고정되지 않았기 때문에 주기는 아무 것도 계산하지 않으며 계산할 수 없다는 것입니다.)))

OrderSelect()는 pos 변수에 적합하지 않은 true 또는 false 부울 값을 반환합니다. 그리고 주문을 놓치지 않도록 가장 오래된 순서, 즉 역순으로주기를 계산하는 것이 좋습니다.

카운터로서의 Total 변수는 분명히 여기에서 유용할 것입니다.

비 ECN 계정의 테스터에 대해 OrderSend 이후에 불필요한 추가 오류 출력을 제거하고 이미 주문을 엽니다.

그리고 네, 판매 SL 레벨 계산이 잘못되었으니 좀 더 주의가 필요합니다.

우와!!! 고맙습니다! 이것은 반성이 필요합니다.

어딘가에 새로운 규칙에 대한 "자습서"가 있습니까? 쪽번호 4자리가 좀 짜증나네요...