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

 

구글링해서 읽을 의향이 조금도 없어서 D:\1.txt 파일을 열었습니다 .

 /*
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew
HINSTANCE ShellExecuteW(
  HWND    hwnd,
  LPCWSTR lpOperation,
  LPCWSTR lpFile,
  LPCWSTR lpParameters,
  LPCWSTR lpDirectory,
  INT     nShowCmd
);
*/
#import "shell32.dll"
int ShellExecuteW( int hWnd, string lpVerb, string lpFile, string lpParameters, string lpDirectory, int nCmdShow);
#import
#define SW_SHOW 5
#define SW_SHOWNORMAL 1
//+------------------------------------------------------------------+
void OnStart ()
{
   ShellExecuteW( NULL , "Open" , "notepad.exe" , "D:\\1.txt" , NULL ,SW_SHOW); 
}
//+------------------------------------------------------------------+
 

표시기에서 수행하는 가장 좋은 방법은 타이머 1초를 시작하거나 OnCalculate에서 시간(초)을 비교하는 것입니다.

<1초, 종료

아니면 다른 작업 옵션이 있습니까?

한 달 동안 HistorySelect를 업데이트해야 함 + 개체 작업

 
Fast235 :

또는 OnCalculate 비교 시간(초)

<1초, 종료

1초로는 충분하지 않습니다. 요점은 datetime입니다. 1초 미만일 수 없습니다.

최소 밀리초 비교

 int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const LastOnCalculate = GetTickCount (); &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
{
   static uint LastOnCalculate = GetTickCount ();
   if ( GetTickCount () - LastOnCalculate < 1000 ) return (rates_total);
   LastOnCalculate = GetTickCount ();
   .........
   return (rates_total);
}
Fast235 :

표시기에서 수행하는 가장 좋은 방법은 타이머 1초를 시작하거나 OnCalculate에서 시간(초)을 비교하는 것입니다.


내 의견으로는 어디에서 수행하는지는 중요하지 않습니다. 유일한 것은 OnCalculate가 틱에 연결되어 있다는 것입니다. 틱이 없으므로 OnCalculate에 대한 호출이 없습니다.

Fast235 :

한 달 동안 HistorySelect를 업데이트 하고 개체 작업을 해야 합니다 .

기록선택   빠르지만 1000 + 미만의 개체가 있는 경우 여기에 개체를 이동하거나 지연을 생성하기 위해

매초마다 이러한 개체를 수정합니다.


일반적으로 코드를 작성하면 함정이 즉시 나타납니다. )))

 

1초면 충분하고 진드기가 올 때까지 덜 자주

차트에 거래를 표시하기 위해 + 막대를 통한 거래 결과 및 글로벌 추세와 같은 일부 반정적 정보

시계 가격 변경 가능

 int OnCalculate ( const int rates_total,       // размер массива price[] 
                 const int prev_calculated,   // обработано баров на предыдущем вызове 
                 const int begin,             // откуда начинаются значимые данные 
                 const double & price[]       // массив для расчета 
   );

또는 두 번째 옵션에서 시간

 

제발 말해!

현재 차트 기호를 필요한 기호와 어떻게 비교할 수 있습니까?

       case 1 : // кейс для открытия Buy по AUD/USD
               if ( Symbol () == (как обозначить нужный символ для сравнения?))                                     // если символ текущего графика AUD/USD открываем сделку
               {
                  RefreshRates();
                  Open_Order = OrderSend ( "AUDUSD" ,OP_BUY,Lot(),Ask, 0 , 0 , 0 ); // Открытие ордера
//----------------------------------------------------------------------------------------------------
В тоже время советник запущен на другом графике и пытается произвести открытие ордера, цены не совпадают и соответственно вылетает ошибка - неверные цены

       case 2 : // кейс для открытия Bay по GBP/USD 
               if ( Symbol () == (как обозначить нужный символ для сравнения?)) 
// если символ текущего графика не AUDUSD то выходим
               {
                  RefreshRates();
                  Open_Order = OrderSend ( "GBPUSD" ,OP_SELL,Lot(),Bid, 0 , 0 , 0 ); // Открытие ордера

Т.е. надо ему дать понять, что тот или иной кейс принадлежит тому или другому графику, но чтот я пока не придумал как

프로그램이 AUD/USD 쌍에 대한 주문을 열어야 한다는 것을 이해하고 이를 엽니다(이는 정상적으로 작동함). 그러나 동시에 다른 열린 차트 에서 이 주문을 열려고 시도합니다(로봇은 여러 통화 쌍에서 실행), EA가 실행 중인 다른 통화 쌍에 대해 각각 가격 오류로 반환됩니다. 따라서 Symbol() ==가 주문을 열어야 하는 기호와 같으면 해당 기호를 열고, 그렇지 않으면 종료합니다. 나는 터미널에서 심볼의 이름을 설정하고 비교하기 위해 변수로 아무데도 선택하지 않았습니다.

 
Denis Diakonov :

말해주세요!

현재 차트 기호를 필요한 기호와 어떻게 비교할 수 있습니까?

프로그램이 AUD/USD 쌍에 대한 주문을 열어야 한다는 것을 이해하고 이를 엽니다(이는 정상적으로 작동함). 그러나 동시에 다른 열린 차트 에서 이 주문을 열려고 시도합니다(로봇은 여러 통화 쌍에서 실행), EA가 실행 중인 다른 통화 쌍에 대해 각각 가격 오류로 반환됩니다 . 따라서 Symbol() ==가 주문을 열어야 하는 기호와 같으면 해당 기호를 열고, 그렇지 않으면 종료합니다. 나는 터미널에서 심볼의 이름을 설정하고 비교하기 위해 변수로 아무데도 선택하지 않았습니다.

적절한 가격을 얻는 것의 끝에 예가 있습니다.

SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
  • docs.mql4.com
2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром. Если функция используется для получения информации о последнем тике, то лучше использовать SymbolInfoTick(). Вполне возможно, что по данному символу с...
 
Denis Diakonov :

감사합니다. 하지만 정확한 가격은 필요하지 않습니다. 모든 것이 가격이 좋습니다. 주문이 열린 통화 쌍이 로봇이 연결된 현재 열린 차트 와 일치하지 않는 경우 고문이 주문을 열지 않도록 해야 합니다. 시간대가 있는 새 차트를 열고 필요한 순서를 연 다음 이 차트를 닫는 방식으로 구현할 수 있습니다. 지금 시도하겠습니다.

 string   symbol;
....
int OnInit ()
{...
 symbol= Symbol ();
....
}
void OnTick ()
...
 if (symbol == Symbol ())
{
... //открываем ордер
}
....
 
Valeriy Yastremskiy :
발레리 야스트렘스키 :

아니요, 그런 식으로 작동하지 않습니다.

내 프로그램은 현재 차트에 액세스하여 현재 장비의 이름을 할당하고 변수에 봉인한 다음 이 변수의 값을 차트의 현재 기호와 비교합니다. 실제로, 그것은 자신과 비교))) Sympol()을 다른 변수와 비교할 수 있는 값으로 어떻게든 변환해야 합니다. 예를 들어:

문자열USDUSD;

( 기호() == AUDUSD)

그런 다음 param pam pam .. 어떻게 든 나에게 효과가 있었지만 행복하고 모든 것을 변경해야 하는 대로 변경했습니다. 더 이상 작동하지 않습니다.))

 
Denis Diakonov :

아니요, 그런 식으로 작동하지 않습니다.

내 프로그램은 현재 차트에 액세스하여 현재 장비의 이름을 할당하고 변수에 봉인한 다음 이 변수의 값을 차트의 현재 기호와 비교합니다. 실제로, 그것은 자신과 비교))) Sympol()을 다른 변수와 비교할 수 있는 값으로 어떻게든 변환해야 합니다. 예를 들어:

문자열USDUSD;

(기호() == AUDUSD)

그런 다음 param pam pam .. 어떻게 든 나에게 효과가 있었지만 행복하고 모든 것을 변경해야 하는 대로 변경했습니다. 더 이상 작동하지 않습니다.))

문자열 USDUSD = "USDUSD";

적어도 그렇게.

 
Denis Diakonov :

아니요, 그런 식으로 작동하지 않습니다.

내 프로그램은 현재 차트에 액세스하여 현재 장비의 이름을 할당하고 변수에 봉인한 다음 이 변수의 값을 차트의 현재 기호와 비교합니다. 실제로, 그것은 자신과 비교))) Sympol()을 다른 변수와 비교할 수 있는 값으로 어떻게든 변환해야 합니다. 예를 들어:

문자열USDUSD;

(기호() == AUDUSD)

그런 다음 param pam pam .. 어떻게 든 나에게 효과가 있었지만 행복하고 모든 것을 변경해야 하는 대로 변경했습니다. 더 이상 작동하지 않습니다.))

Expert Advisor, 스크립트, 인디케이터는 적용되지 않지만 현재 창에서 작동합니다. 그리고 다른 창/차트 의 전역 변수는 겹치지 않습니다. 그래서 그것은 작동해야합니다)

문자열USDUSD; // 이것은 텍스트 변수이며 초기에는 비어 있습니다. 동일 ""

(Symbol() == AUDUSD) // 이 행 은 AUDUSD 변수와 아무 관련이 없습니다.

 Symbol
Возвращает имя символа текущего графика.
string    Symbol ();
Возвращаемое значение
Значение системной переменной _Symbol , в которой хранится имя символа текущего графика.

그러나 주문 개시 기준은 다른 상품/창구에 대해 동일하지 않아야 합니다. 그들이 동일하다면 실제로 모든 창에서 열립니다.