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

 

안녕하세요 프로그래밍 전문가

차트 위와 전문가가 표시한 텍스트 아래에 작은 들여쓰기(미학용)가 있는 왼쪽 상단 모서리 에 배경색으로 채워진 사각형을 그리는 방법을 알려주실 수 있습니까?

미리 감사드립니다

 
if(!trend)
      {

      (if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)     // Если бар соответствует требуемым признакам..
          cnt++;                                                                     // .. прибавим 1 к счётчику

      if (Close[i] < Open[i])                                                        // Если бар, не соответствует основному признаку..
          cnt = 0;   
      }
      else
      {
      ...
      }
 
소리 알림 라이브러리를 다운로드할 수 있는 위치를 알려주세요. 즉, 예를 들어 "매수 포지션은 이익실현으로 마감되었습니다."와 같은 음성이 재생되도록 합니다. PlaySound ("Buy_close_tp.wav")에서 재생할 수 있습니다.
 
YOUNGA :

이것은 같은 것입니다. 다른 상황에 대해서만 페인트도 칠하십시오.
 
당신은 가거나 체크 무늬! 추세 변수를 숫자 값으로 전달하면 예를 들어 차이에 +1 또는 -1을 곱할 수 있습니다(나는 이것을 하지 않을 것입니다)
 
CYBOPOB :

그래서, 그렇지 않습니까?

Artyom, 업무에 사용하지 말고 코드를 작성 하십시오. 응? 아니면 당신의 손에 그 물건을 주십시오, 내가 이 고통을 끝내겠습니다...

아니요, 조금만 더 기다리세요, 고생하세요... :) 생성된 분기를 버리지 않도록, 포럼을 흩뜨리지 않도록 코드를 벽돌로 분해해 보겠습니다.
 
tCynik :

테스터의 작업에 대해 질문이 있습니다 . 테스트를 통과한 후 매개변수(날짜, 통화 쌍, 기간)를 변경하고 테스트를 다시 시작합니다. 테스트가 계속되고 완료되면 "차트 " 및 "보고서" 탭은 전혀 변경되지 않습니다. 모든 것이 이전 테스트에서 그대로 유지됩니다. 저장된 보고서도 오래되었습니다. 그 이유는 무엇이며 해결 방법은 무엇입니까? 결과를 재설정하는 기능이 있습니까?

나는 매뉴얼, 기사, 포럼 검색 - 그런 문제에 대한 언급을 보지 못했습니다.


이렇지 않아야 합니다. 아마도 "최적화" 확인란이 선택되어 있습니까?
 
Sepulca :

이렇지 않아야 합니다. 아마도 "최적화" 확인란이 선택되어 있습니까?


아, 이런 경우가 있는 것 같습니다. 새 테스트를 시작할 때 최적화가 활성화되어 있다는 사실에 주목하지 않고 중요하지 않다고 생각했습니다. 약간 이상한 UI...

그러나 이제 모든 것이 작동합니다. 대단히 감사합니다!

 
TarasBY :
나는 논리를 많이 탐구하지 않았지만 뭔가가 나에게 추가 계산이 있음을 알려줍니다. 1년 반 전에 나는 천문분의 시작 부분에 명료한 컷이 있는 M1 양초 형성과 인용문 수집으로 같은 유형의 작업을 해결했습니다.
관심이 있는 경우 순전히 코드(파일) 최적화에 대한 몇 가지 사항을 확인할 수 있습니다. 사실, 최적화에 대해 진지하다면 코드의 실행 시간을 측정해야 합니다. ;)


지금은 처음부터 완전히 다른 것을 시도하고 있습니다.

매핑에 관해 Vadim에게 질문합니다. 그래서. 처음부터 모든 것을 시작했습니다. 소유자의 원래 틱 TF를 사용합니다.

 int start()
  {  
//----
if (flag == true )
  {
   if (tick.time.local == true )
    {
    time = TimeLocal ();
    }
     else {
    time = TimeCurrent ();
    }
   if (t < time)
    { 
         t = time; 
    }
     else { 
         t ++;
    }   

   if ( FileSeek (hand1e, fpos, SEEK_SET ) == false )
           { 
           error = GetLastError ();
           Print ( "out: error(" ,error, "): " ,ErrorDescription(error));
           flag = false ;
           return ;
           }
           else {
           bid = MarketInfo(symbol, MODE_BID);
           ask = MarketInfo(symbol, MODE_ASK);
           
                 FileWriteInteger (hand1e,    t,   LONG_VALUE);            
                 FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);          
                 FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);            
                 FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);    
                 FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);                            
                 FileWriteDouble (hand1e, time, DOUBLE_VALUE);                   
       FileFlush        (hand1e);  

      fpos = FileTell (hand1e);
      
       if (tick.chart.update == true )
        {
                  hwnd = WindowHandle(sn, 1 );
         if (PostMessageA(hwnd, WM_COMMAND, 0x822c , 0 ) == false )
          {
          hwnd = 0 ;
           return ;
          }
          PostMessageA(hwnd, MT4InternalMsg, 2 , 1 );             
          }                  
      } 
  }
//----
   return ( 0 );
  }

여기에서 논리는 원칙적으로 간단하고 가장 단순합니다. 우리는 입찰 요청을 포착하고 RateInfo를 형성하지만 시간을 볼륨에 입력하고 시간을 시뮬레이션합니다. 이제 Time이 어떻게 모델링되는지 이해하지 못한 채 시뮬레이션을 완전히 제거하고 표준 TOLHCV에 따라 수행하고 그 전에 "마지막 시작() 호출 이후 0초 이상 경과한 경우"를 설정합니다. 동일한 조건의 다른 분기에서 less가 통과했다면 High-Low를 편집하고 Volume을 증가시키십시오. 즉, 실제로 완전히 제거 된주기, 즉 배치 된 것과 동일한 것입니다. "구멍이 있는" 두 번째 TF를 얻습니다(초 간격 포함).

 int start(){  
//----
         if (flag){
                bid = MarketInfo(symbol, MODE_BID);
                ask = MarketInfo(symbol, MODE_ASK);
                   
                 if ( FileSeek (hFile, fpos, SEEK_SET ) == false ){ 
                        error = GetLastError ();
                         Print ( "out: error(" ,error, "): " ,ErrorDescription(error));
                        flag = false ;
                         return ;
                } else {
                         if (time== TimeCurrent ()){
                                 if (bid<bid_prev){
                                         FileSeek (hFile, fpos- 32 , SEEK_SET );
                                         FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                         FileFlush        (hFile);
                                }
                                 if (bid<bid_prev){
                                         FileSeek (hFile, fpos- 24 , SEEK_SET );
                                         FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                         FileFlush        (hFile);
                                }
                                vol++;
                                 FileSeek (hFile, fpos- 8 , SEEK_SET );
                                 FileWriteDouble (hFile,  vol, DOUBLE_VALUE);
                                 FileFlush        (hFile);
                                bid_prev=bid; ask_prev=ask;
                        } else {
                                time= TimeCurrent ();
                                vol= 1 ;
                                 if (bid<bid_prev){close=bid; open=ask;
                                } else {close=ask; open=bid;}
                                ask_prev=ask; bid_prev=bid;
                                
                                 FileWriteInteger (hFile,  time,  LONG_VALUE);
                                 FileWriteDouble (hFile,  open, DOUBLE_VALUE);
                                 FileWriteDouble (hFile,  bid, DOUBLE_VALUE);
                                 FileWriteDouble (hFile,  ask, DOUBLE_VALUE);
                                 FileWriteDouble (hFile,  close, DOUBLE_VALUE);
                                 FileWriteDouble (hFile,  vol, DOUBLE_VALUE);
                                 FileFlush        (hFile);
                                fpos = FileTell (hFile);
                        }
                         if (tick.chart.update == true ){
                                hwnd = WindowHandle(sn, 1 );
                                 if (PostMessageA(hwnd, WM_COMMAND, 0x822c , 0 ) == false ){
                                        hwnd = 0 ;
                                         return ;
                                }
                                PostMessageA(hwnd, MT4InternalMsg, 2 , 1 );             
                        }            
                } 
        }
   return ( 0 );
}

또한 완전히 강세 - 약세에 그라데이션을 떠났다. 게임은 촛불의 가치가 있습니까? 이 옵션과 소유자의 초기 옵션을 인쇄하여 GetTickCount() 를 확인하고 설정하고 동일한 차트에서 동시에 실행하고 로그를 확인합니다.

 16 : 14 : 56 Сек.тф с проп. AUDUSD,M1: 0
16 : 14 : 56 Тик.тф AUDUSD,M1: 0
16 : 14 : 56 Сек.тф с проп. AUDUSD,M1: 0
16 : 14 : 56 Тик.тф AUDUSD,M1: 0
16 : 14 : 56 Сек.тф с проп. AUDUSD,M1: 0
16 : 14 : 57 Тик.тф AUDUSD,M1: 0
16 : 14 : 57 Сек.тф с проп. AUDUSD,M1: 0
16 : 14 : 58 Тик.тф AUDUSD,M1: 0
16 : 14 : 58 Сек.тф с проп. AUDUSD,M1: 0
16 : 14 : 58 Тик.тф AUDUSD,M1: 0
16 : 14 : 58 Сек.тф с проп. AUDUSD,M1: 0
16 : 14 : 58 Тик.тф AUDUSD,M1: 0
16 : 14 : 58 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 00 Тик.тф AUDUSD,M1: 0
16 : 15 : 00 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 00 Тик.тф AUDUSD,M1: 0
16 : 15 : 00 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 04 Тик.тф AUDUSD,M1: 0
16 : 15 : 04 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 04 Тик.тф AUDUSD,M1: 0
16 : 15 : 04 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 05 Тик.тф AUDUSD,M1: 0
16 : 15 : 05 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 05 Тик.тф AUDUSD,M1: 0
16 : 15 : 05 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 05 Тик.тф AUDUSD,M1: 0
16 : 15 : 05 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 06 Тик.тф AUDUSD,M1: 0
16 : 15 : 06 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 07 Тик.тф AUDUSD,M1: 0
16 : 15 : 07 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 08 Тик.тф AUDUSD,M1: 0
16 : 15 : 08 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 08 Тик.тф AUDUSD,M1: 0
16 : 15 : 08 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 09 Тик.тф AUDUSD,M1: 0
16 : 15 : 09 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 09 Тик.тф AUDUSD,M1: 0
16 : 15 : 09 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 09 Тик.тф AUDUSD,M1: 16
16 : 15 : 09 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 10 Тик.тф AUDUSD,M1: 0
16 : 15 : 10 Сек.тф с проп. AUDUSD,M1: 16
16 : 15 : 11 Тик.тф AUDUSD,M1: 0
16 : 15 : 11 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 11 Тик.тф AUDUSD,M1: 0
16 : 15 : 11 Сек.тф с проп. AUDUSD,M1: 0
16 : 15 : 12 Тик.тф AUDUSD,M1: 0
16 : 15 : 12 Сек.тф с проп. AUDUSD,M1: 15
 

예상했던 것입니다. 눈금 - 원본, 간격이 있는 초 - 수정됨. 이제 time=TimeCurrent() 전에 보조 배열을 형성합니다.

Δt= TimeCurrent ()-time;
Σ=Σ+Δt;
ArrayResize (ind, Σ);
for (; i<Σ; i++) ind[i]=iBars(sn, 1 );
GlobalVariableSet ( "final" , i);
time= TimeCurrent ();

이것은 두 번째 tf 코드에 있습니다. 바로 두 번째 TF에서 중단되는 EA의 경우 x초 전의 TOLHCV 값은 다음을 제외하고 ind[GlobalVariableGet("final")]-ind[GlobalVariableGet("final")-x]+1로 얻을 수 있습니다. 물론 이 배열은 전달하는 것입니다. 따라서 매핑을 사용합니다.

 //в шапке
#import "SharedMemoryMT4.dll"
         int MemoryCreate( int nArea, string sPrefixArea, int hFileUser, int nIndex, string sName, int nSize);
         bool MemoryWriteInt( int nArea, string sPrefixArea, int nIndex, string sName, int nStartByte, int nValue);
         bool MemoryCloseHandle( int nArea, string sPrefixArea, int hMemory);
#import
//в инит
hMapping=MemoryCreate( 1 , "" , NULL , - 1 , "ind" , 60 * GlobalVariableGet ( "ADXBars" ));
//в деинит
MemoryCloseHandle( 1 , "" , hMapping);
//в старт вместо 
for (; i<Σ; i++) MemoryWriteInt( 1 , "" , - 1 , "ind" , i, iBars(sn, 1 )); //ind[i]=iBars(sn, 1);

몇 초 동안 멈추고 x초 전에 TOLHCV 값을 읽는 테스트 스크립트를 작성합니다(촛불 아님):

 #property show_inputs
#import "SharedMemoryMT4.dll"
   int MemoryOpen( int nArea, string sPrefixArea, int nIndex, string sName);
   int MemoryReadInt( int nArea, string sPrefixArea, int nIndex, string sName, int nStartByte);
#import
extern int x; //сколько секунд назад с данного момента прикрепления смотрим значения TOLHCV

int init()
  {
   MemoryOpen( 1 , "" , - 1 , "ind" );
   return ( 0 );
  }
int start()
  {
   //MemoryReadInt(1, "", -1, "ind", i) это ind[i], GlobalVariableGet("final") это последний элемент в массиве, а ф-ла выглядит так: n=ind[final]-ind[final-x]+1
   int n=MemoryReadInt( 1 , "" , - 1 , "ind" , GlobalVariableGet ( "final" ))-MemoryReadInt( 1 , "" , - 1 , "ind" , GlobalVariableGet ( "final" )-x)+ 1 ;
   Alert (TimeToStr( TimeCurrent (),TIME_SECONDS), ": Time=" , TimeToStr(Time[n], TIME_SECONDS), ", Open=" , Open[n], ", High=" , High[n], ", Low=" , Low[n], ", Close=" , Close[n], ", Volume=" , Volume[n]);
   return ( 0 );
  }

두 번째 기간을 시작합니다. 초기화되면 창이 표시됩니다.

Ошибка в методе "Utils::Memory::Mapping::Create()" .
В файловом отображении ""
не выделена память при отсутствии дескриптора пользовательского файла.

로그에서 58.572회

10:45:42 SandyEw7-2.4 EURUSD,M1: function 'MemoryWriteInt' call from dll 'SharedMemoryMT4.dll' critical error c0000005 at 02CA05A3.
...
10:48:43 SandyEw7-2.4 EURUSD,M1: function 'MemoryWriteInt' call from dll 'SharedMemoryMT4.dll' critical error c0000005 at 02CA05A3.

초기화 해제되면 창을 표시합니다.

В методе "MT4::Memory::SearchIndexOrHandle()" не установлен параметр для поиска в области памяти терминала.

글쎄, 비초기화는 나중에, 나는 스크립트를 넣었다 - 절대 경고하지 않는다. MemoryCreate 및 MemoryCloseHandle을 주석 처리하면 로그에 아무 것도 출력하지 않습니다(경고 스크립트 표시).

 10 : 54 : 55 PrintForSec sec_EURUSD,M1 inputs: x= 8 ; 
10 : 54 : 56 PrintForSec sec_EURUSD,M1: initialized
10 : 54 : 56 PrintForSec sec_EURUSD,M1: Alert : 09 : 55 : 05 : Time= 00 : 00 : 00 , Open= 0 , High= 0 , Low= 0 , Close= 0 , Volume= 0

10 : 55 : 36 PrintForSec sec_EURUSD,M1 inputs: x= 2 ; 
10 : 55 : 37 PrintForSec sec_EURUSD,M1: initialized
10 : 55 : 38 PrintForSec sec_EURUSD,M1: Alert : 09 : 55 : 46 : Time= 00 : 00 : 00 , Open= 0 , High= 0 , Low= 0 , Close= 0 , Volume= 0

- 그리고 그게 다야. 따라서 논리적으로 잘못된 순서로 호출을 사용하고 있습니다. 또는 선언 중이거나 잘못된 것을 선언하고 있습니다. 축 WinXP. Vadim, 적어도 이동 방향을 알려주세요.

사유: