[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 228

 
//записать

void SaveArray(string File, double &a[])
{
    int h = FileOpen(File, FILE_BIN|FILE_WRITE);
    if(h>0)
    {
      int sz = ArraySize(a); 
      FileWriteArray(h,a,0,sz);
      FileClose(h);
    }
}

//прочитать

void OpenArray(string File, double &a[], int sz)
{
    int h = FileOpen(File, FILE_BIN|FILE_READ);
    if(h>0)
    {
      ArrayResize(a,sz);
      FileReadArray(h,a,0,sz);
      FileClose(h);
    }
}
 
공지사항입니다
 int Buy[]; int Sell[];       string FileBuy= "FileBuy.csv" ,FileSell= "FileSell.csv" ;
 
paladin80 :
프로그램 실행 자원의 비용을 줄이는 측면에서 변수의 유형(int, double 등)을 선언하는 것이 더 나은 곳은 어디입니까? 예. int i는 전역 수준에서 선언하거나 int start() ... in for (int i=OrdersTotal()-1; i>=0; i--) ... 선언할 수 있습니다. 각 틱에 대해 extern 매개변수 직후에 전역 수준에서 한 번보다 더 비쌉니다. 아니면 자원 집약도의 차이가 동일한가요?

어쨌든 모든 변수(메모리의 변수를 위한 장소)는 프로그램 시작 시 한 번 생성되며, 그 변수는 텍스트에서 발생한 장소( 변수 선언 )에서 초기화되어야 하지만 항상 일어나는 것은 아니며, 따라서 모든 것이 제대로 작동하도록 하려면 선언할 때 명시적으로 초기화하는 것을 잊지 마십시오. 속도에 영향을 미치지 않으면 최소한 사이클 내부에서 선언할 수 있습니다.
 
쉬르킨 :

귀하의 코드에 따라 코드가 수정되었습니다.
테스트하는 동안 첫 번째 틱, 다섯 번째 - 다음 틱에 배치 순서대로 4개의 주문이 마감되었습니다. 여기에 다른 문제가 있을 수 있습니다. 반복적으로 테스트했습니다.
테스터 로그의 프로그램 코드와 항목이 제공됩니다.
감사합니다. 쉬르킨

공습 경보 해제. 바꾸다

 for (i= 0 , int k= 0 ; i< OrdersTotal ();i++,k++) //

 int total= OrdersTotal ();
for (i= 0 , int k= 0 ; i<total;i++,k++) //
 
안녕하세요. 히스토그램의 각 개별 블록에서 표시기 값의 합을 계산하는 방법을 알려주세요. 표시기를 작성 했지만 설치한 순간부터 작동하기 시작합니다. 이전 막대는 비어 있습니다! "while" 루프를 관리할 수 없습니다! 전문가 여러분, 도와주세요.

	          
 

다음과 같은 상황이 있습니다.

 //+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for ( int obj= 0 ; obj<= ObjectsTotal ()- 1 ; obj++)
   {
      objName = ObjectName (obj);
      isObj = ObjectFind (objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName, 0 );
   }
   Print ( "objPriceCurr = " , objPriceCurr);
      
       if (isObj != - 1 )   // Если объект найден, значит выходим из функции
         return ( true );
         
   return ( false ); // Объект не найден!
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false )
   {
       Print ( "В окне отсуствуют объекты, поиск продолжается..." );
       return ( 0 );
   }

오해가 있었던 부분을 코드로 보여줬습니다. 모든 변수는 전역으로 선언됩니다. IsObjectFound() 함수에서 현재 막대에 있는 개체의 첫 번째 및 두 번째 가격 포인트 값, 이름 및 개체 가격 값을 가져옵니다. 객체가 발견되면 함수는 true 모드에서 종료되어야 하고 그렇지 않으면 false 입니다.

처음에 객체를 찾지 못하면 함수를 종료한다는 조건을 작성했습니다.

 if (IsObjectFound() == false )
   {
       Print ( "В окне отсуствуют объекты, поиск продолжается..." );
       return ( 0 );
   }

테스터에서 실행하고 개체를 그리지 않았으며 아무것도 없습니다. 베어 그래프입니다. 그러나 함수가 종료되지 않고 그에 따라 인쇄되지 않습니다.

 Print ( "В окне отсуствуют объекты, поиск продолжается..." );

시작 기능의 실행은 계속됩니다. 이게 뭔가요?

 
아주 나쁜 일입니다.
 
뭐가 문제 야?
 

전역 변수 - 전역 조회. 데이터 모델을 보지 않고 알고리즘에 대해 무엇을 말할 수 있습니까?

데이터를 추적하겠습니다. isObj는 부울이고 그 모든 것은...

 
tara :

전역 변수 - 전역 조회. 데이터 모델을 보지 않고 알고리즘에 대해 무엇을 말할 수 있습니까?

데이터를 추적하겠습니다. isObj는 부울이고 그 모든 것은...


 //+-------------------------------------------------------------------------------------+
//|                                                TradingByLine.mq4                    |
//|                                                              hoz                    |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link       ""

extern string ___H0 = "Параметры отклонений зоны сигнала" ;
extern double dernovich = 40 ,
              faustUs = 40 ;
/*extern double limitOverLine = 3,
              limitUnderLine = 20;*/

string objName;                                   // Имя объекта
int isObj;                                       // Возвращает окно, которому принадлежит
                                                 // ..наденнный объект, либо -1
double objPrice1,                                 // Первая координата цены луча     
       objPrice2,                                 // Вторая координата цены луча
       objPriceCurr;                             // Цена объекта на заданном баре
int pt;

#define SIGNAL_BUY         0                      // Сигнал на покупку
#define SIGNAL_SELL         1                      // Сигнал на продажу
#define SIGNAL_NO         - 1                      // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   if ( Digits == 2 || Digits == 4 )
     pt = Point ;
   if ( Digits == 1 || Digits == 3 || Digits == 5 )
     pt = Point * 10 ;
   if ( Digits == 6 )
     pt = Point * 100 ;
   if ( Digits == 7 )
     pt = Point * 1000 ;

   return ( 0 );
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
   return ( 0 );
}
//+-------------------------------------------------------------------------------------+
//| Сигнализатор касания о луч                                                          |
//+-------------------------------------------------------------------------------------+
bool AlertByTouching( int signal)
{
   double priceDevBefore,
          priceDevAfter;
   
   if (signal == SIGNAL_SELL)
   {
      priceDevAfter = objPriceCurr + faustUs * pt;
      priceDevBefore = objPriceCurr - dernovich * pt;

       if (Bid <= priceDevAfter && Bid >= priceDevBefore)
      {
         Print ( "Внимание. На инструменте " , Symbol (), " ожидается 3-е касание луча. Готовься продавать!" );
         Alert ( "Внимание. На инструменте " , Symbol (), " ожидается 3-е касание луча. Готовься продавать!" );
         
         return ( true );
      }
   }
   if (signal == SIGNAL_BUY)
   {
      priceDevAfter = objPriceCurr - faustUs * pt;
      priceDevBefore = objPriceCurr + dernovich * pt;
       Print ( "priceDevAfter = " , objPriceCurr - faustUs * pt);
       Print ( "priceDevBefore = " , objPriceCurr - faustUs * pt);
       Print ( "Ask >= priceDevAfter && Ask >= priceDevBefore " , Ask , " >= " , priceDevAfter , " && " , Ask , " >= " , priceDevBefore);
       if (Ask >= priceDevAfter && Ask >= priceDevBefore)
      {
         Print ( "Внимание. На инструменте " , Symbol (), " ожидается 3-е касание луча. Готовься покупать!" );
         Alert ( "Внимание. На инструменте " , Symbol (), " ожидается 3-е касание луча. Готовься покупать!" );
         
         return ( true );
      }
   }
   return ( false );
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool GetSignal()
{
   if (!IsObjectFound())
       return (SIGNAL_NO);
   if (objPrice1 > objPrice2)
       return (SIGNAL_BUY);
   if (objPrice1 < objPrice2)
       return (SIGNAL_SELL);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for ( int obj= 0 ; obj<= ObjectsTotal ()- 1 ; obj++)
   {
      objName = ObjectName (obj);
      isObj = ObjectFind (objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName, 0 );
   }
   Print ( "objPriceCurr = " , objPriceCurr);
      
       if (isObj != - 1 )   // Если объект найден, значит выходим из функции
         return ( true );
         
   return ( false ); // Объект не найден
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false )
   {
       Print ( "В окне отсуствуют объекты, поиск продолжается..." );
       return ( 0 );
   }
   
   if (signal != SIGNAL_NO)
       if (!AlertByTouching(signal))
         return ( 0 );
   
   Print ( "objPrice1 = " , objPrice1, ", objPrice2 = " , objPrice2);
   // Print("objPriceCurr = ", objPriceCurr);

   return ( 0 );
}
isObjint 입니다. 개체가 있는 경우 해당 개체가 포함된 창을 반환합니다. 그것이 없으면 내가 이해하는 것처럼 값 -1 이 반환됩니다. 도크에 따르면 메인 창은 0 부터 시작하고 그 다음에는 하위 창... 여기까지는 트레이딩 전문가를 위한 스케치, 순전히 신호입니다. 그러나 그는 원할 때 메시지를 보냅니다.