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

 
drknn :

이해할 수 없습니다. 시장 주문을 시작할 때 그런 줄이 있습니다. 또한 그것을 연기에 복사하고 변수를 추가해도 아무 일도 일어나지 않습니다. 동일한 오류 4107이 로그에 기록되고 보류 주문을 넣습니다. 너무 힘들지 않아, 내가 놓친 것을 봐주세요

파일:
test_21_1.mq4  15 kb
 
FoxUA :

이해할 수 없습니다. 시장 주문을 시작할 때 그런 줄이 있습니다. 또한 그것을 연기에 복사하고 변수를 추가해도 아무 일도 일어나지 않습니다. 동일한 오류 4107이 로그에 기록되고 보류 주문을 넣습니다. 너무 힘들지 않아, 내가 놓친 것을 봐주세요


읽을 수 없는 코드 구성이 있습니다. 예, 변수 이름에는 이러한 약어가 있으므로 가독성이 복잡합니다.

코드는 블록으로 구성되어야 합니다. 무엇이 문제인지 한 눈에 알 수 있도록 변수에 이름을 지정합니다. 상수의 이름(직접 사용)은 대문자로 작성합니다. 값이 있는 상수 초기화는 초기화 블록에 배치해야 합니다. 예를 들어, 당신은 라인을 완전히 부당하게 사용했습니다.

stringy = 기호();

EA 시작시. 글쎄요, 전체 거래에서 거래 상품의 이름이 변경되지 않는 경우 왜 매 틱마다 Symbol() 함수를 호출 해야 합니까? 초기화 블록에서 sy 변수의 값을 1회 초기화하면 충분합니다. 다음은 코드 블록입니다.

pral=StopLossLastPos(sy,OP_BUY,- 1 ) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,- 1 );  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,- 1 );   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,- 1 ) ; // цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

기본적으로 사실이 아닙니다! 마지막 주문의 손절매를 확인하려면 먼저 OrderSelect()를 사용하여 해당 주문(주문)을 선택해야 합니다. 아래 주문 카운터의 예를 참조하세요. 즉, 마지막 주문의 중지 수준이 필요한 경우 루프를 통해 이를 수행해야 합니다. 수행원. 설계

 int total = OrdersTotal ();
if (total == 0 ){

}

정당하지 않다. OrdersTotal () 함수는 터미널에서 이미 열린 총 주문 수를 반환합니다. 이 숫자에는 다른 거래 상품에 대해 개설된 주문, 특히 고문이 발생하는 동일한 상품에 대해 고문이 아닌 귀하가 개인적으로 수동으로 개설한 주문도 포함됩니다.

손으로 거래하지 않고 동시에 거래가 고문이 던져진 거래 수단에서만 진행되는 경우이 구성이 작동합니다. 그러나 고문이 수동 거래를 방해하지 않도록 동시에 손을 병렬로 거래하고 싶거나 다른 거래 상품에서 거래가 동일한 방식으로 진행되기를 원하면 이 디자인은 당신을 실망시킬 것입니다. 따라서 각 유형의 거래 주문에 대해 별도의 주문 카운터를 작성하는 것이 좋습니다. 다음은 그러한 카운터의 예입니다.

 //=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy( int MAGIC){
  string SMB= Symbol ();
  int SchBuy= 0 ;
  for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--) {
    if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )){
      Print ( "Ошибка № " , GetLastError (), " при выборе ордера № " ,i);
    }
    else {
      if ( OrderSymbol ()!= SMB || OrderMagicNumber ()!= MAGIC){ continue ;} // если не наш, то смотрим следующий
      if (OrderType()== OP_BUY ){ 
        SchBuy++;
      }  
    }
  }
  return (SchBuy);
}                  

위의 권장 사항을 고려하여 코드를 다시 작성하십시오!!!

 

죄송합니다.

pral=StopLossLastPos(sy,OP_BUY,- 1 ) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

서브루틴을 호출합니다.

그러나 여전히 다르게 구성하는 것이 좋습니다.

>> 이중 StopLossLastPos(문자열 sy="", int op=-1, int mn=-1) {

서브루틴에 거래 상품의 상징적 이름을 전달할 필요가 없습니다. 귀하의 서브루틴은 링크 라이브러리가 아니라 EA에 있습니다. sy 변수는 Expert Advisor의 전역 수준에서 선언되기 때문에 이 변수는 이러한 서브루틴의 범위에 있습니다. 다음으로, 서브루틴에 두 번째 매개변수를 전달하지만 서브루틴 자체를 호출할 때 이 매개변수를 값( int op=-1)으로 초기화합니다. 이 매개변수를 수행할 필요가 없습니다. 다음 매개변수도 마찬가지입니다.

라인

>> if (op<0 || OrderType()==op) {

다시 읽을 수 없습니다. 내 카운터에 어떻게 정리되어 있는지 보세요!

 

그리고 여기에 다른 것이 있습니다. 코드 블록

pral=StopLossLastPos(sy,OP_BUY,- 1 ) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,- 1 );  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,- 1 );   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,- 1 ) ; // цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

매 틱마다 호출됩니다. 그러나 모든 진드기에 필요한 것은 아닙니다. 일부 경우에만 정지/이익 주문 을 알아야 합니다. 여기에서 이러한 경우 서브루틴 호출도 포함해야 합니다.

 
spidey :

좋은 시간, 터키에 대한 경고를 고정하십시오(녹색 십자형 빨간색은 위에서 아래로 - 매도, 뒤로 - 매수)

글쎄, 다시 누군가가 포럼에 훔친 코드를 게시하고 있습니다. :)))))))))

이 숫자가 매겨진 변수의 뒤죽박죽을 무료로 파헤치고 싶어할 사람이 있을지는 의문입니다. :)

 
spidey :

좋은 시간, 터키에 대한 경고를 고정하십시오(녹색 십자형 빨간색은 위에서 아래로 - 매도, 뒤로 - 매수)

반복되면 목욕을 청원해야 할 것입니다.

디컴파일된 지표를 게시하는 것은 포럼 규칙을 위반하는 것입니다.

 
코드를 게시해야 합니까?
 
drknn :

죄송합니다.

서브루틴을 호출합니다.

그러나 여전히 다르게 구성하는 것이 좋습니다.

>> 이중 StopLossLastPos(문자열 sy="", int op=-1, int mn=-1) {

서브루틴에 거래 상품의 상징적 이름을 전달할 필요가 없습니다. 귀하의 서브루틴은 링크 라이브러리가 아니라 EA에 있습니다. sy 변수는 Expert Advisor의 전역 수준에서 선언되기 때문에 이 변수는 이러한 서브루틴의 범위에 있습니다. 다음으로, 서브루틴에 두 번째 매개변수를 전달하지만 서브루틴 자체를 호출할 때 이 매개변수를 값( int op=-1)으로 초기화합니다. 이 매개변수를 수행할 필요가 없습니다. 다음 매개변수도 마찬가지입니다.

라인

>> if (op<0 || OrderType()==op) {

다시 읽을 수 없습니다. 내 카운터에 어떻게 정리되어 있는지 보세요!

Tobish, 내가 이해하는 것처럼 함수 호출 은 간단하게 작성할 수 있습니다.

PrAskLim = StopLossLastPos(OP_SELL) ; 그리고 함수 자체에서

더블 StopLossLastPos(int op=-1,) 그렇죠?

예, 이미이 사이트에서 기능을 가져왔다고 말했고 로봇이 확인되었으므로 가능한 것과 무엇에 대한 경험이 아직 충분하지 않기 때문에 변수를 더 읽기 쉬운 변수로 변경할 수 없습니다. 그렇지 않습니다. 이것은 내가 작업 기능에서 뭔가 잘못된 변경을 할 수 있고 모든 것이 코드 더미에서 바늘을 다시 찾고 있다는 사실로 가득 차 있습니다.

이미 추가한 내용은 최대한 수정했지만,

그러나 이것은 모든 것이 4107로 쓰여진 로그의 문제를 해결하지 못했습니다. 여기서 질문은 보류 주문을 설정하는 기능 자체가 작동하고 있었고 아무것도 크게 변경하지 않았기 때문에 가격과 중지를 어떻게 narmolyze 할 수 있습니까? 그 안에.

두 번째 질문은 이 가격에 스프레드를 추가하는 방법입니다. PrAskLim = StopLossLastPos(OP_SELL) ; (확산=MarketInfo(sy, MODE_SPREAD); )

수정된 버전의 어드바이저를 게시하고 있습니다.

파일:
test_21_2.mq4  16 kb
 
spidey :
코드를 게시해야 합니까?
도난당한 물건을 버리지 마십시오.
 
drknn :
도난당한 물건을 버리지 마십시오.

당신은 훔칠 필요가 없습니다.

그러나이 자원의 규칙은 금지되어 있지 않습니다 ...

https://www.mql5.com/ru/code/8089

;)