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

 
drknn :


코드가 올바르지 않습니다. 먼저 start() 함수가 int 유형이면 정수 값을 반환해야 합니다. 반품시에는 조건하에 만 반품됩니다. 그리고 조건이 충족되지 않으면 Start 함수는 터미널에 무엇을 반환해야 합니까?

또한 수표를 너무 복잡하게 만들었습니다. 이렇게 하는 것이 좋습니다. 오늘 열고 닫은 주문 카운터를 만듭니다. 오늘의 주문 수가 0보다 크면 거래하지 않습니다. 그렇지 않으면 거래가 허용됩니다.

int를 void로 변경했습니다 ... 도움이되지 않았습니다

솔직히 말하면, 나는 주문 카운터를 만드는 방법을 완전히 이해하지 못하고 동시에 1 일 거래 옵션을 활성화 / 비활성화하는 기능을 유지합니다 ....

.... 생각과 생각: 나는 이것을 시도할 것이다

if(CalculateCurrentOrders(Symbol())==0 && 주문==0)

{

CheckForOpen();

if (WaitForNewDay) {주문++;}

반품;

}

카운터 재설정:

if(WaitForNewDay)CheckForNewDay();

무효 CheckForNewDay()

{

tm=iTime(심볼(), PERIOD_D1,0 );

if (bt!=tm) {bt=tm; 주문=0;}

}

일반적으로 나는 도망 쳤던 것으로 돌아 왔습니다.)))

 
dzhini :

int를 void로 변경했습니다 ... 도움이되지 않았습니다

솔직히 말하면, 나는 주문 카운터를 만드는 방법을 완전히 이해하지 못하고 동시에 1 일 거래 옵션을 활성화 / 비활성화하는 기능을 유지합니다 ....

--------------

일반적으로 나는 도망친 것으로 돌아 왔습니다.)))

 //+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                          Copyright © 2010, Drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Drknn"
#property link       "drknn@mail.ru"

// ---------- Пользовательские переменные ----------------------------
extern int       MAGIC= 0 ; //У ордеров открытых вручную MAGIC=0

// ------------ Вспомогательные переменные --------------------------
string    ExpertName= "0" ; // имя советника
string     SMB;
bool       DobroTorga;

//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){

  SMB= Symbol ();
  return ( 0 );
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
         if (!IsTesting()){
     Comment ( "" );
     Print ( "Советник деинициализирован (выключен совсем)" );
  }
   return ( 0 );
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if (!IsTradeAllowed()){
     Comment ( "Торговля запрещена в настройках терминала, либо торговый поток занят" );
     Print ( "Торговля запрещена в настройках терминала, либо торговый поток занят" );
     return ( 0 );
  }
  DobroTorga=true;
  if (SchBuy(MAGIC)+SchSell(MAGIC)+HistSchBuy(MAGIC)+HistSchSell(MAGIC)> 0 ){
    DobroTorga=false;
  }
  if (DobroTorga==true){
    // ---- добро торговать есть - ставим ордера ---------
  }
  return ( 0 );
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+


// =================================================================================================
// ************************* Счётчики ордеров ******************************************************
// =================================================================================================

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy( int MAGIC){
   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);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell( int MAGIC){
  int SchSell= 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_SELL){
        SchSell++;
      }
    }
  }
 return (SchSell);     
}                  
//==================================================================================================

//=========== HistSchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров сегодняшнего дня в истории
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int HistSchBuy( int MAGIC){
  int SchBuy= 0 ;
   for ( int i=OrdersHistoryTotal()- 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){ 
         if (OrderOpenTime()>=iTime(SMB, PERIOD_D1 , 0 )){
          SchBuy++;
        }
      }  
    }
  }
  return (SchBuy);
}                  
//==================================================================================================


//=========== HistSchSell()  ===============================
//  Функция возвращает количество Sell-ордеров сегодняшнего дня в истории
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int HistSchSell( int MAGIC){
   int SchSell= 0 ;
   for ( int i=OrdersHistoryTotal()- 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_SELL){
         if (OrderOpenTime()>=iTime(SMB, PERIOD_D1 , 0 )){
          SchSell++;
        }
      }
    }
  }
 return (SchSell);     
}                  
//==================================================================================================
 
친애하는 포럼 사용자는 코드를 도와줍니다. 상황은 내가 수동으로 수평선을 그려서 움직이고 가격이 닿으면 신호가 발생해야한다는 것입니다.
 
Alexandr24 :
친애하는 포럼 사용자는 코드를 도와줍니다. 상황은 내가 수동으로 수평선을 그려서 움직이고 가격이 닿으면 신호가 발생한다는 것입니다.

가격이 선에 닿았습니다. 신호가 있습니다. 이것은 분명합니다. 코드에 무슨 문제가 있습니까?
 
drknn :


오늘 당신은이 주제를 담당합니다))) 감사합니다. 나는 이것을 정리할 것이다
 
죄송합니다. 작업을 잘못 설정했습니다.)) 이 작업을 수행하는 실제 코드가 필요합니다.
 
Alexandr24 :
죄송합니다. 작업을 잘못 설정했습니다.)) 이 작업을 수행하는 실제 코드가 필요합니다.


가장 먼저 이해해야 할 것은 선이 객체라는 것입니다. 프로그램 코드는 이름으로 개체를 구별합니다. 코드에 라인명을 적어준 다음, 차트에 라인을 놓을 때 해당 속성을 입력하고 코드에 쓰여진 이름으로 이름을 변경해야 합니다. 이 경우에만 코드는 이 개체에서 가져온 판독값을 처리해야 한다는 것을 이해할 것입니다.

다음 코드에서는 라인이 위치한 가격을 요청해야 합니다. 요청은 double ObjectGet (문자열 이름, int prop_id) 함수를 통해 이루어집니다. 이름 대신 라인 이름을 지정하고 prop_id 대신 OBJPROP_PRICE1을 지정해야 합니다. 따라서 이 라인이 설정된 가격을 프로그래밍 방식으로 얻을 수 있습니다. 이 값을 가져와 변수에 저장합니다. 코드에서 더 나아가 이 라인의 가격을 터치하기 위한 수표를 구성해야 합니다. 예: 이전 틱에서 가격이 선이 있는 수준보다 낮고 동시에 현재 틱에서 이 수준보다 크거나 같으면 터치가 발생한 것입니다.

Alexander, 코드가 있는 무언가가 당신을 위해 작동하지 않는다면, 그들이 여기에서 도움을 줄 것입니다. 귀하 대신 코드를 작성해야 하는 경우 여기로 이동할 수 있습니다 https://www.mql5.com/en/job .

 
int start()
  {
   int    i, counted_bars=IndicatorCounted();
//----

 double n=ObjectGet( "n" ,OBJPROP_PRICE1); 
 if (Close[ 0 ]==n&&Close[ 0 ]!= 0 )
 Alert ( Symbol (), "  n  " ,n);

//----
Comment (n);
   return ( 0 );
  }
그렇게 했지만 Close[0]==n일 때 어떤 이유로 신호가 작동하지 않습니다. 어떻게 수정하시겠습니까? 조건이 충족되지만 어떤 이유로 작동하지 않습니다.
 
Alexandr24 :
그렇게 했지만 Close[0]==n일 때 어떤 이유로 신호가 작동하지 않습니다. 어떻게 수정하시겠습니까?


글쎄, 코드로 판단하면 지표를 만들었습니다. 따라서 이 코드 섹션의 성능을 확인하려면 앉아서 다음 틱이 라인에 닿을 때까지 기다려야 합니다. 이 코드 섹션을 디버그하려면 스크립트 생성을 사용하는 것이 좋습니다. 그러면 결과가 즉시 제공됩니다.

가장 먼저 확인해야 할 것은 코드가 실제로 줄을 보는지 확인하는 것입니다. 그것을 하는 방법? 가격을 요청하고 화면에 경고를 표시해야 합니다. 우리는하다.

 //+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
   string LineName= "1" ;
  double MyLine=- 100 ;
  MyLine=ObjectGet(LineName,OBJPROP_PRICE1);
  if (MyLine> 0 ){
    Alert ( "Горизонтальная линия " ,LineName, " установлена на уровень = " ,MyLine);
  }
  else {
    Alert ( "Запрос значения линии " ,LineName, " вренул ошибку № " , GetLastError ());
  }
  return ( 0 );
}
//+------------------------------------------------------------------+

스크립트가 다시 컴파일되었으므로 차트를 열고 그 위에 수평선 을 그립니다. 그런 다음 속성을 입력하고 코드에서 줄에 "1"이라는 이름을 할당했기 때문에 이 이름을 줄의 속성에도 넣습니다.

확인을 누릅니다. 차트에 스크립트를 던지고 경고가 정확한 가격을 반환했는지 확인합니다. 차트를 따라 선을 다른 위치로 이동하고 스크립트를 차트에 다시 던집니다. 손으로 선의 위치를 변경해도 코드가 여전히 보고 인식하는지 확인합니다.

글쎄, 같은 정신으로 계속하십시오.

 

시각화가 활성화된 테스터를 통해 지표를 테스트합니다. 경고를 트리거하려면 값의 정규화가 필요하기 때문에 코드를 약간 수정했습니다. 그러나 현재 막대의 줄을 재정렬하면 시간별 시계가 있다고 가정 해 봅시다. 어떤 이유로 줄이 현재 막대를 따라 움직일 때 경고는 1 번만 작동하고 경고는 작동하지 않습니다. 다른 바를 기다려야 합니다.

 int start()
  {
   int    i, counted_bars=IndicatorCounted();
//----
double b= NormalizeDouble ((Close[ 0 ]), Digits );
 double n= NormalizeDouble (ObjectGet( "n" ,OBJPROP_PRICE1), Digits ); 
 if (b==n&&b!= 0 )
 Alert ( Symbol (), "  n  " ,n);

//----
Comment (n);
   return ( 0 );
  }