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

 
Vitaly Muzichenko # :

참여하겠습니다 :)

DAX30 인덱스가 있습니다 = 9에서 22까지 인용

Timeframe M15, H1 등의 세션에 몇 개의 막대가 있는지 확인하는 방법

막심 쿠즈네초프 # :

(22*3600-9*3600)/PeriodSeconds(M15)

그러나 이것은 이상적입니다. "너무 많은 막대가 9:00에서 22:00 사이에 있어야 합니다."

기간이 짧을수록 오류가 더 강해지며 실제로는 거의 항상 오류가 적습니다. 기록으로 "모든 N 막대 - 다음 세션"을 계산할 수 없습니다.

모든 것이 훨씬 쉽습니다 ...

 int    Bars ( 
   string            symbol_name,     // имя символа 
   ENUM_TIMEFRAMES   timeframe,       // период 
   datetime          start_time,       // с какой даты 
   datetime          stop_time         // по какую дату 
   );
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

모두에게 좋은 하루.

당신의 도움이 필요합니다.

EA에는 현재 이익을 계산하기 위한 내장 함수가 있습니다.

 double GetProfitFromStart()
  {
   double lp= 0 ,cp= 0 ;
   for ( int i= 0 ; i<OrdersHistoryTotal(); i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (Start<OrderCloseTime()) {lp+=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return (lp+cp);
  }
void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
       if (CountOrders()== 0 )
     {
// Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     }
// Пишем какой лот текущий и какой следующий
      DrawLABEL( "nextlot"    , 1 , 5 , 0 ,Color1(), StringConcatenate ( "CURRENT LOT: " ,DoubleToStr(LOT(), 2 )));
      DrawLABEL( "currentlot" , 1 , 5 , 0 ,Color2(), StringConcatenate ( "NEXT LOT: " ,DoubleToStr(LOT(), 2 ))); 
       DrawLABEL( "lab_Take" , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 )));
      TrailingOrders();
   }

void OnTick은 위와 같이 구성됩니다.

다음 조건이 충족될 때 이익 카운터를 0.0으로 재설정하는 방법:

if(CountOrders()==0) && (GetProfitFromStart()>0

즉, 모든 주문이 마감되고 마지막 주문을 마감할 때의 총 이익이 > 0???

 

MT4를 설치했습니다. 새 터미널을 로드할 때마다 터미널을 닫은 후 따옴표를 저장하지 않습니다.

 
Maxim Kuznetsov # :

4-ke에서도 " 먼저 열고 수정 "하는 것이 좋습니다.

모든 사람이 손절매를 동시에 배치하여 시장에서 열 수 있는 것은 아닙니다.

그건 그렇고, Stop Loss는 모든 곳에서 발생하지 않습니다. 그것은 또한 브로커의 서버에서 처리되는 중지 주문이며 이것은 그의 개인 서비스(장점, 위험, 수입)이며 당신이 상상했던 곳이 아니라 중지 주문의 거래 유리가 없습니다.

감사합니다. 예, 다른 브로커의 데모도 조건이 너무 다른 것 같습니다.

 
законопослушный гражданин # :

모두에게 좋은 하루.

당신의 도움이 필요합니다.

EA에는 현재 이익을 계산하기 위한 내장 함수가 있습니다.

void OnTick은 위와 같이 구성됩니다.

다음 조건이 충족될 때 이익 카운터를 0.0으로 재설정하는 방법:

if(CountOrders()==0) && (GetProfitFromStart()>0

즉, 모든 주문이 마감되고 마지막 주문을 마감할 때의 총 이익이 > 0???

임무가 명확하지 않기 때문입니다. 카운팅 기능은 매번 주문/포지션을 반복하기 시작하고 0에서 이익을 합산합니다.

 double lp= 0 ,cp= 0 ;

무엇을 재설정하시겠습니까? 열린 포지션/시장가 주문이 없는 경우 카운트 기능은 0을 반환합니다. 자체적으로 재설정됩니다)))

 
законопослушный гражданин # :

모두에게 좋은 하루.

당신의 도움이 필요합니다.

다음 조건이 충족될 때 이익 카운터를 0.0으로 재설정하는 방법:

즉, 모든 주문이 마감되고 마지막 주문을 마감할 때의 총 이익이 > 0???

이것에서 정확히 작동하지 않는 것은 무엇입니까?

 

좋은 시간. 도와주세요.

마이너스 수익이 있는 마감된 주문을 찾고 있습니다.
결과적으로 건너 뛰고 모든 부정적인 주문의 결과를 얻지는 못합니다.

나는 글쓰기를 배우고 있다.

 double Minus_profit(){
 for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--){
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)){
         if (OrderSymbol() == Symbol () && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OP_SELL)){
           if (OrderCloseTime()>=time && OrderTicket()>ticket){
             if (OrderProfit()+OrderSwap()+OrderCommission()< 0 ){
             time=OrderCloseTime();
             ticket=OrderTicket();
             profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
             result=profit+swap+comis;   
   }}}}} return (result);
}
 
Alexander Avksentyev # :

좋은 시간. 도와주세요.

마이너스 수익이 있는 마감된 주문을 찾고 있습니다.
결과적으로 건너 뛰고 모든 부정적인 주문의 결과를 얻지는 못합니다.

나는 글쓰기를 배우고 있다.

얼핏 보면 끝에서 위치를 정렬하는 동시에 닫는 시간을 변수에 쓰는 것을 알 수 있습니다. 가장 최근에 마감된 위치의 시간을 캡처하여 다음 조건이 더 이상 사실이 아닐 수 있습니다.

OrderCloseTime()>=time

왜냐하면 다른 포지션은 마감 시간이 더 짧습니다. 모두 소팅에 의존하지만 이 문제는 표준 소팅에서 나온다.


그리고 이 조건을 수정

(OrderType() == OP_BUY || OP_SELL)

(OrderType() == OP_BUY || OrderType() == OP_SELL)

오 예 .. 내가 기억하는 한, 위치가 기록에서 가져온 경우 스왑과 수수료의 최종 결과는 이미 OrderProfit()에 저장됩니다. 열린 위치에서 - 아니요, 모든 것을 요약해야 합니다. 그러나 이것은 정확하지 않습니다. 확인하십시오.

 
Nikita Chernyshov # :

얼핏 보면 끝에서 위치를 정렬하는 동시에 닫는 시간을 변수에 쓰는 것을 알 수 있습니다. 가장 최근에 마감된 위치의 시간을 캡처하여 다음 조건이 더 이상 사실이 아닐 수 있습니다.

왜냐하면 다른 포지션은 마감 시간이 더 짧습니다. 모두 소팅에 의존하지만 이 문제는 표준 소팅에서 나온다.


그리고 이 조건을 수정

오 예 .. 내가 기억하는 한, 위치가 기록에서 가져온 경우 스왑과 수수료의 최종 결과는 이미 OrderProfit()에 저장됩니다. 열린 위치에서 - 아니요, 모든 것을 요약해야 합니다. 그러나 이것은 정확하지 않습니다. 확인하십시오.

고맙습니다. 그것이 정상적으로 작동하는 방식입니다.

 double Minus_profit(){
time= TimeCurrent ();
 for ( int i= 0 ; i<OrdersHistoryTotal(); i++){
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)){
       if (OrderSymbol() == Symbol () && OrderMagicNumber()==Magic){
         if (OrderType() == OP_BUY || OrderType() ==OP_SELL){
         if (OrderCloseTime()>=time){
           if (OrderProfit()+OrderSwap()+OrderCommission()<= 0 ){
              time=OrderCloseTime();
              profit+=OrderProfit();swap+=OrderSwap(); ;comis+=OrderCommission();
              result=profit+swap+comis;   
   }}}}}} return (result);
}

더 나아가; 긍정적인 이익이 있는 주문이 들어오면 결과를 재설정하고 더 부정적인 결과를 찾아야 합니다.

 
Alexander Avksentyev # :

좋은 시간. 도와주세요.

마이너스 수익이 있는 마감된 주문을 찾고 있습니다.
결과적으로 건너 뛰고 모든 부정적인 주문의 결과를 얻지는 못합니다.

나는 글쓰기를 배우고 있다.

이와 유사한 상황에서는 디버거를 사용하는 것이 좋습니다.

사유: