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

 

좋은 오후입니다. 신사 숙녀 여러분. )) 아마추어리즘에 대해 사과드립니다 ..

나는 OrderClose가 어떻게 작동하는지 이해하지 못합니다 :(

최대 1개 주문해야 합니다. 즉, 새 것을 열기 전에 이전 것이 닫히도록 ..

왜 그렇게 작동하지 않습니까?


OrderClose(명목, 0.01, 입찰가, 5, 빨간색);

OrderSend(Symbol(), OP_SELL, 0.01, NormalizeDouble (Bid,5), 3, NormalizeDouble(Ask+0.0005,5), NormalizeDouble(Bid-0.0008,5), "", nom,0,Red);


로그는 기본적으로 잘못된 티켓에 맹세합니다..

nom 대신 OrderClose에 무엇을 삽입해야 합니까? 아니면 내가 잘못된 방향으로 생각하고 있습니까?

 
Sergey Voytsekhovsky :

시도 MinStopLoss = 현재 가격 +/- (MaxValue(2*Spread, StopLevel));

나는 방문했다. 두 스프레드는 24이므로 작동하지 않으며 종가에서 19에서 작동하기 시작합니다. 현재 시가 에서 3개의 스프레드로 작동합니다.
나는 사이클에서 스톱을 1포인트 늘리고 주문을 열었습니다. 19시에 오픈했습니다. 문제는 선택하는 방법이 아닙니다. 문제는 올바르게 계산하는 방법입니다. 버튼으로 중지가 설정되어 있으면 수동으로 주문을 열 때도 표시되기 때문에 가격이 없습니다. 말도 안되는 소리입니다. 이제 나는 전체 포럼에 대해 연속적으로 대중을 존중하고 있습니다. 7 페이지(message # 65)에서 몇 가지 기능을 찾았습니다. 확인하는대로 작성하겠습니다.

 
Sergey Voytsekhovsky :

나는 그것을 연구했고 새로운 것을 배우지 못했습니다. 분명히 (나에게 새로운) 그것은 당연하게도 모든 입문자에게 자명합니다. 위에서 설명한 인덱싱 중 버퍼의 상호 배열 기능 외에는 찾을 수 없었습니다. 나는 이 순서를 따랐고, 더 비참한 그림을 얻었다.

아래 사진, 파일첨부

당신은 매우 운이 좋지 않을 수도 있지만, 나는 다른 사람들의 코드를 망치는 것을 좋아하지 않습니다. 특히 편집...

다음 질문: 얼마나 자주 지표 값이 정확히 50과 같을 것이라고 생각합니까?

         ColorHistogram_2Buffer1[i]= 50 ; 

작업을 이해한 대로 한 색상 > 50 및 다른 색상 < 50이어야 하지만 == 50을 어디에서도 본 적이 없습니다. 물론 == 50인 경우 손실을 없애려면 비교 중 하나에 >=50 또는 다른 <=50을 추가해야 합니다.이것이 종교가 허용하는 방식입니다. 얼마나 아름답게 보일지.

그리고 두 번째 질문: 버퍼의 전체 인덱싱을 변경하는 데 얼마나 필요했습니까? 다시 인덱싱한 후 코드의 모든 항목이 수정되었습니까? 인덱스가 4인 색상 버퍼와 보조 버퍼 5와 6을 각각 할당하는 것이 더 쉬울 수도 있습니다. 편집해야 하는 횟수가 줄어들고 실수를 더 많이 저지를 가능성이 줄어듭니다.

 
klok79 :
나는 방문했다. 두 스프레드는 24이므로 작동하지 않으며 종가에서 19에서 작동하기 시작합니다. 현재 시가 에서 3개의 스프레드로 작동합니다.
나는 사이클에서 스톱을 1포인트 늘리고 주문을 열었습니다. 19시에 오픈했습니다. 문제는 선택하는 방법이 아닙니다. 문제는 올바르게 계산하는 방법입니다. 버튼으로 중지가 설정되어 있으면 수동으로 주문을 열 때도 표시되기 때문에 가격이 없습니다. 말도 안되는 소리입니다. 이제 나는 전체 포럼에 대해 연속적으로 대중을 존중하고 있습니다. 7 페이지(message # 65)에서 몇 가지 기능을 찾았습니다. 확인하는대로 작성하겠습니다.

확인했습니다. 공장
모두 이상합니다. 같은 minStopLoss = Current price +/- (MaxValue(2*Spread, StopLevel)) 가 거기에 쓰여지고, Current price 만 주문 개시 가격이 아니라 미러 가격입니다.
이중 스프레드가 적합한 이유는 무엇입니까?
두 가지 질문이 더 생깁니다.
1. Digits() 및 Point()를 가져와야 하는 이유 SymbolInfoInteger가 사용됩니까?
2. SymbolInfoInteger 함수를 호출하기 전에 표기법(int)을 사용하는 이유는 무엇입니까? 내가 알기로는 이것은 강제 유형 변환입니다.

 
klok79 :

확인했습니다. 공장
모두 이상합니다. 같은 minStopLoss = Current price +/- (MaxValue(2*Spread, StopLevel)) 가 거기에 쓰여지고, Current price 만 주문 개시 가격이 아니라 미러 가격입니다.
이중 스프레드가 적합한 이유는 무엇입니까?
두 가지 질문이 더 생깁니다.
1. Digits() 및 Point()를 가져와야 하는 이유 SymbolInfoInteger가 사용됩니까?
2. SymbolInfoInteger 함수를 호출하기 전에 표기법(int)을 사용하는 이유는 무엇입니까? 내가 알기로는 이것은 강제 유형 변환입니다.

Point()를 얻으려면 SymbolInfoInteger가 어떤 식으로든 작동하지 않습니다.)))

일반적으로 Point() 또는 _Point는 현재 문자 전용임을 잊지 않기 위해 필요합니다. 어드바이저가 작동하는 심볼 이외의 심볼의 경우 이 기능을 사용해야 합니다.

SymbolInfoInteger 함수는 int 값뿐만 아니라 long, bool 및 enum 값도 반환합니다.

 

Sergey Voytsekhovsky, 도움을 주셔서 감사합니다. 그리고 한 가지 더 질문, 어렵지 않다면 CharToStr 함수 의 역함수를 알려주세요.
(심볼에서 코드를 얻으려면) 그렇지 않으면 BASIC과 Delphi에서 왔습니다. 이에 대한 함수가 있으며 C ++에는 내가 이해하는 것처럼 두 가지 방법이 있습니다.
1 - mql4에 없는 ascii_cod 함수
2. - 다이렉트 타입 캐스팅 . 하지만 웬일인지 나는 코드를 가지고있다.
문자열 st="A";
인쇄("문자 코드 A=",(int)st);

문자 기호 코드 A=0을 표시합니다.

어떻게 될 것인가?

 
klok79 :

Sergey Voytsekhovsky, 도움을 주셔서 감사합니다. 그리고 한 가지 더 질문, 어렵지 않다면 CharToStr 함수 의 역함수를 알려주세요.
(심볼에서 코드를 얻으려면) 그렇지 않으면 BASIC과 Delphi에서 왔습니다. 이에 대한 함수가 있으며 C ++에는 내가 이해하는 것처럼 두 가지 방법이 있습니다.
1 - mql4에 없는 ascii_cod 함수
2. - 다이렉트 타입 캐스팅 . 하지만 웬일인지 나는 코드를 가지고있다.
문자열 st="A";
인쇄("문자 코드 A=",(int)st);

문자 기호 코드 A=0을 표시합니다.

어떻게 될 것인가?

StringToCharArray 는 wack 함수와 달리 한 번에 한 문자만 변환하는 것이 아니라 문자열을 문자열 의 모든 문자 코드 인 ucar 유형의 배열로 변환할 수 있습니다.

mql4에도 이러한 기능이 있습니다.

Документация по MQL5: Преобразование данных / StringToCharArray
Документация по MQL5: Преобразование данных / StringToCharArray
  • www.mql5.com
Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов. [in]  Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо...
 
Alexey Viktorov :

Point()를 얻으려면 SymbolInfoInteger가 어떤 식으로든 작동하지 않습니다.)))

일반적으로 Point() 또는 _Point는 현재 문자 전용임을 잊지 않기 위해 필요합니다. 어드바이저가 작동하는 심볼 이외의 심볼의 경우 이 기능을 사용해야 합니다.

SymbolInfoInteger 함수는 int 값뿐만 아니라 long, bool 및 enum 값도 반환합니다.

음, 실제로 Point는 이중 값을 가집니다. 따라서 요청을 SymbolInfoDouble 로 만들어야 합니다.

 
Konstantin Nikitin :

음, 실제로 Point는 이중 값을 가집니다. 따라서 요청을 SymbolInfoDouble 로 만들어야 합니다.

게시물 #65 에서 MQL4에 대한 이러한 기능에 대해 이야기하고 있습니다.

 //+------------------------------------------------------------------+
double CorrectStopLoss( string symbol_name, int op, double price_set, double stop_loss) {
   if (stop_loss== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op==OP_BUY)? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op==OP_SELL)? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,stop_loss),dg));
   else return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss( string symbol_name, int op, double price_set, int stop_loss) {
   if (stop_loss== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op==OP_BUY)? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op==OP_SELL)? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,price-stop_loss*pt),dg));
   else return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit( string symbol_name, int op, double price_set, double take_profit) {
   if (take_profit== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op==OP_BUY)? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op==OP_SELL)? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,take_profit),dg));
   else return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit( string symbol_name, int op, double price_set, int take_profit) {
   if (take_profit== 0 ) return ( 0 );
   double pt= SymbolInfoDouble (symbol_name, SYMBOL_POINT );
   double price=(op==OP_BUY)? SymbolInfoDouble (symbol_name, SYMBOL_BID ):(op==OP_SELL)? SymbolInfoDouble (symbol_name, SYMBOL_ASK ):price_set;
   int lv=StopLevel(symbol_name), dg=( int ) SymbolInfoInteger (symbol_name, SYMBOL_DIGITS );
   if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return ( NormalizeDouble ( fmax (price+(lv+ 1 )*pt,price+take_profit*pt),dg));
   else return ( NormalizeDouble ( fmin (price-(lv+ 1 )*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel( string symbol_name) {
   int sp=( int ) SymbolInfoInteger (symbol_name, SYMBOL_SPREAD );
   int lv=( int ) SymbolInfoInteger (symbol_name, SYMBOL_TRADE_STOPS_LEVEL );
   return ((lv== 0 )?sp* 2 :lv);
   }
//+------------------------------------------------------------------+

SymbolInfoInteger() 를 통해 Point를 얻는 곳을 보지 못했습니다.

 
Artyom Trishkin :

게시물 #65 에서 MQL4에 대한 이러한 기능에 대해 이야기하고 있습니다.

SymbolInfoInteger() 를 통해 Point를 얻는 곳을 보지 못했습니다.

예, 거의 동일합니다. 글쎄, 그들은 건너 뛰었습니다. 가장 중요한 것은 그가 무엇을 이해한다는 것입니다 ...