초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1441

 

좋은 아침, 좋은 기분!

건설적인 비판을 고려하여 수표 함수의 코드를 변경했습니다:

bool Check_Trading()
  {
//--- проверка разрешения автоматической торговли на терминале
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Print("Ошибка разрешения автоматической торговли на терминале! ",GetLastError());
      return(false);
     }
//--- проверка разрешения автоматической торговли на стороне сервера
   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
     {
      Print("Ошибка разрешения автоматической торговли на стороне сервера! ",GetLastError());
      return(false);
     }
//--- проверка синхронизированности данных по текущему символу между терминалом и сервером
   if(!SymbolIsSynchronized(_Symbol))
     {
      Print("Ошибка синхронизированности данных по текущему символу! ",GetLastError());
      return(false);
     }
//--- проверка достаточности средств для торговли
   if(!CheckMoneyForTrade(_Symbol,GetLot(),ORDER_TYPE_SELL))
     {
      Print("Ошибка проверки достаточности средств для торговли! ",GetLastError());
      return(false);
     }
//--- проверки корректности объёма сделки
   string descript;
   if(!CheckVolumeValue(GetLot(),descript))
     {
      Print("Ошибка проверки корректности объёма сделки! ",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

여기에서 무료로 사용할 수 있고 여기에서 가져온 CheckMoneyForTrade() 및 CheckVolumeValue() 함수는 게시되지 않습니다.

이 최소값으로 어제 전날 발생한 Expert Advisor 문제를 예방하기에 충분할까요?

감사합니다, 블라디미르.

 
MrBrooklin #:

여러분, 좋은 아침, 좋은 기분입니다!

건설적인 비판을 고려하여 확인 기능의 코드를 변경했습니다:

CheckMoneyForTrade() 및 CheckVolumeValue() 함수는 자유롭게 사용할 수 있고 여기에서 가져온 것이므로 게시하지 않습니다.

이 최소한의 조치로 전날 발생한 Expert Advisor 문제를 예방하기에 충분할까요?

감사합니다, 블라디미르.

예, 정상인 것 같지만 하나의 함수에서 볼륨과 충분성을 확인하고 충분성에 대한 논리를 변경하는 것이 좋습니다. 마진 랏이 더 큰지 작은지 확인하지만 줄이지 않고 요청 된 랏이 더 작 으면 사용 가능한 마진과 관련하여 랏을 계산하고 어떤 랏을 설정할 수 있는지, 최소 랏과 비교하고 더 작 으면 거래가 확실히 끝납니다.

 

안녕하세요 여러분! 스토캐스틱 RSI 지표가 있습니다. 문제는 매우 느리게 작동한다는 것입니다. 내가 이해하는 한 주요 "브레이크"는 배열에서 최소 및 최대를 검색하는 데 사용되는 큰 기간으로 인해이 섹션을 만듭니다:

   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;   

이상적으로는 표시기가 첫 번째 실행 중에 기록의 모든 막대를 통과하고 다음 실행 중에 마지막 막대 만 업데이트하는 것이 해결책이 될 수 있습니다. 하지만 어떻게 해야 할지 모르겠습니다. 이 작업을 수행 할 수 있습니까? 그렇다면 방법에 대한 링크 나 조언을 공유해 주시면 감사하겠습니다.

다음은 표시기의 전체 코드입니다:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{ // OnCalculate

ArraySetAsSeries(time,true);

if( t != time[0]) { // контроль бара
t = time[0];

ArrayInitialize(Buffer_Step1_RSI,0);
CopyBuffer(RSI_Handle,0,0,rates_total,Buffer_Step1_RSI);

double lRsi, lLowestRsi, lHighestRsi;
int ZZZ = rates_total - MathMax(MathMax(RsiLength,StochLength),MathMax(SmoothK,SmoothD)) - 1; 

for (int i = ZZZ; i >= 0; i-- ) { // Цикл расчета индикатора      
                  
   // ====== Calulate Stochastic of RSI ======   
   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;            
   
   
   // ====== Рассчитываем само значение предварительное (МА1) ======
   // Расчет для всех циклов, кроме первого (МА1)                          
   Step3_MA_Sum = Step3_MA_Sum - Buffer_Step2_Calculate[i + SmoothK + 1] + Buffer_Step2_Calculate[i+1];         
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА1)
   if (i == ZZZ) {
      Step3_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothK + 1; kk++) Step3_MA_Sum = Step3_MA_Sum + Buffer_Step2_Calculate[kk];
      }      
    Buffer_Step3_MA1[i] = Step3_MA_Sum / SmoothK;

          
   // ====== Расчитываем само значение индикатора (МА2) ======        
   // Расчет для всех циклов, кроме первого (МА2)
   Step4_MA_Sum = Step4_MA_Sum - Buffer_Step3_MA1[i + SmoothD+1] + Buffer_Step3_MA1[i+1];   
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА2)   
   if (i == ZZZ) {
      Step4_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothD + 1; kk++) Step4_MA_Sum = Step4_MA_Sum + Buffer_Step3_MA1[kk];
      }            
    Buffer_Step4_MA2_IndicatorData[i] = Step4_MA_Sum / SmoothD;
              
   FirstCycle = false;         
   } // Цикл расчета индикатора


} // контроль бара
return(rates_total);

 } // OnCalculate
 
Valeriy Yastremskiy #:

괜찮다고 생각하지만 볼륨과 충분성 확인을 하나의 기능에 넣고 충분성에 대한 로직도 변경하는 것이 좋습니다. 증거금 랏이 많은지 적은지 확인하되 줄이지 않고, 요청된 랏이 적으면 가용 증거금 대비 랏도 계산해서 어떤 랏을 설정할 수 있는지, 최소 랏과 비교해서 적으면 거래는 확실히 끝나는 식으로 말이죠.

감사합니다, 발레리!

안부, 블라디미르.

 

다음은 이 기능의 첫 번째 결과입니다:

2023.02.02 14:41:05.466 Experts automated trading is disabled because the account has been changed
2023.02.02 14:41:09.990 Experts automated trading is enabled
2023.02.02 14:42:43.410 Experts automated trading is disabled because the account has been changed
2023.02.02 14:42:52.690 Experts automated trading is enabled
2023.02.02 14:43:33.882 Experts automated trading is disabled because the account has been changed
2023.02.02 14:43:44.869 Experts automated trading is enabled

그것이 무엇인지 아는 것이 흥미로울 것입니까? 내가 이미 번역 한 것처럼 러시아어로 번역하는 의미가 아닙니다:

2023.02.02 14:41:05.466 Автоматическая торговля экспертов отключена, так как аккаунт был изменен

그러나 계정을 변경할 수있는 방법의 의미에서? 누구든지 내 계정에서 도대체 무슨 일이 일어나고 있으며 그러한 경우 어떻게해야하는지 알려줄 수 있습니까?

일시적으로 실제 계정에서 데모 계정으로 전환했다는 사실과 관련이 있을까요?

안부, 블라디미르.

 
안녕하세요, 트레이딩뷰에서처럼 차트를 제한 없이 세로로 늘리는 것이 구현 가능한가요, 아니면 준비된 솔루션이 있나요?
 
MrBrooklin #:

실제 계정에서 데모 계정으로 일시적으로 전환한 것과 관련이 있을까요?

 
Sergey Gridnev #:

고마워요, 세르게이, 이제 알겠어요.

안녕, 블라디미르

 
전문가 어드바이저가 지정된 TF의 지표를 사용하는데, 지표 핸들에서 해당 TF를 어떻게 찾을 수 있나요?
 
Aleksey Vyazmikin #:
전문가 어드바이저가 지정된 TF의 지표를 사용하는데, 지표 핸들에서 TF를 어떻게 알 수 있나요?

지정된 TF를 알아야 합니다. 상황을 자세히 설명해 주세요.

사유: