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

 
Motzaart :

안녕하세요.

다중 통화 Expert Advisor에서 오픈 포지션이 트리거될 때 카운터 이동에 대해 보류 중인 주문 을 마감해야 합니다.

이제 이익으로 마감할 때 모든 보류 중인 주문이 모든 통화로 마감됩니다.

통화 쌍에 연결된 보류 중인 주문만 마감되고 나머지는 배치된 상태로 유지되도록 코드를 변경하는 방법은 무엇입니까?

이 코드에서 무엇을 변경해야 합니까?:

이 코드의 Mn은 BUY_STOP 또는 SELL_STOP 보류 주문의 매직 넘버입니다.

이익을 취하여 오픈 포지션을 청산할 때 이 마법으로 주문한 주문이 유지되고 이론상 삭제 명령이 실행되는 것과 같은 논리입니다.

이것은 각 쌍을 테스트할 때 작동합니다. 그러나 다른 통화로 작업하는 경우 모든 쌍에 대한 모든 주문이 삭제됩니다.

할 수 있는 사람을 도와주세요.

아무도이 문제를 귀찮게해서는 안된다는 것을 이해하지만 누군가가 기성품 템플릿을 가지고 있습니까?

나는 매우 감사하게 될 것입니다.

거기서 무엇을 했는지 이해하려면 코드를 편집기에 복사하고 일반적인 스타일 지정(Ctrl+<)을 수행해야 했습니다.

그래서: 나는 거기에 무엇이 쌓여 있는지 코드에 주석을 달았습니다.

 //+------------------------------------------------------------------+
if (OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation= 0 ; // неиспользуемая переменная
     { // лишняя скобка
       for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
        {
         OrderSelect (i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int   type   = OrderType();
         bool result = false ;
         switch (type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
             case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5 , Red);   //break;
             case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5 , Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());   //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

결과적으로 코드는 이 작업을 수행합니다. 즉, 다음 코드와 동일합니다.

 //+------------------------------------------------------------------+
if (OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result= false ;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5 , clrRed );
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5 , clrRed );
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

이제 물어보십시오. 그에게서 무엇을 얻고 싶습니까?

 
Artyom Trishkin :

거기서 무엇을 했는지 이해하려면 코드를 편집기에 복사하고 일반적인 스타일 지정(Ctrl+<)을 수행해야 했습니다.

그래서: 나는 거기에 무엇이 쌓여 있는지 코드에 주석을 달았습니다.

결과적으로 코드는 이 작업을 수행합니다. 즉, 다음 코드와 동일합니다.

이제 물어보십시오. 그에게서 무엇을 얻고 싶습니까?

확인.

 if (OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

바로 여기에:

 extern int mn; //магический номер открытой позиции
int Mn= 10 *mn; //магический номер отложенного ордера
int TimFr1= 72 ,TimFr2= 24 ,TimFr3= 24 ;

int start()
 { if ( Symbol ()== "EURUSD" )mn= 1 ; if ( Symbol ()== "GBPUSD" )mn= 2 ; if ( Symbol ()== "USDCHF" )mn= 3 ; if ( Symbol ()== "USDJPY" )mn= 4 ;
   if ( Symbol ()== "USDCAD" )mn= 5 ; if ( Symbol ()== "EURGBP" )mn= 6 ; if ( Symbol ()== "AUDUSD" )mn= 7 ; if ( Symbol ()== "NZDUSD" )mn= 8 ;
   if ( Symbol ()== "EURJPY" )mn= 9 ; if ( Symbol ()== "EURCHF" )mn= 10 ;

포지션(OP_BUY 또는 OP_SELL)을 열 때 보류 주문 (OP_SELLSTOP 및 OP_BUYSTOP)이 각각 동시에 배치됩니다.

이익실현으로 오픈 포지션을 청산할 때 해당 보류 주문은 취소되어야 합니다. 이 알고리즘은 모든 통화 쌍에 있습니다.

동시에 다른 통화로 된 다른 보류 주문은 남아 있어야 합니다.

 

모두에게 좋은 하루!

표시기 MTF_RSI 스위치가 있습니다.

 input ENUM_TIMEFRAMES       TimeFrame   =   0 ;

말해봐, 차트 전환시 TimeFrame의 자동 변경을 어떻게 든 설정할 수 있습니까?

뭔가

 if (TimeFrame= Period ())
   TimeFrame= "Следующий период" ;        
 
MakarFX :

모두에게 좋은 하루!

표시기 MTF_RSI 스위치가 있습니다.

말해봐, 차트 전환시 TimeFrame의 자동 변경을 어떻게 든 설정할 수 있습니까?

뭔가

구조 또는다차원 배열 을 만들고 필요한 차원을 따라 실행하도록 합니다. 기준이 충족되면 하나의 열(각 열은 자체 타임프레임을 담당함)으로 작업하고 그렇지 않은 경우 다른 열로 작업하면 됩니다. 프로그램 자체는 한 번에 모든 시간대에 액세스할 수 있으므로 작성하는 것이 가능하지만 구현이 매우 방대하고 매우 광범위하기 때문에 이러한 작업의 양은 포럼에 표시되지 않습니다.

 
Seric29 :

구조체 또는 다차원 배열 생성

고맙습니다.

 

이 코드가 실행되지 않는 이유는 무엇입니까?

 typedef double (*CenBr)( string , int , int );CenBr cn_br[ 4 ]; //глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[ 0 ]= iOpen ;

간단한 기능으로 작동하지만 몇 가지 문제가 있습니다.

 
MakarFX :

고맙습니다.

создаём массив double BarOCLH[ 1000 ][ 2 ][ 4 ]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[ 0 , 0 , 0 ]= iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[ 0 , 1 , 0 ]= iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29 :
나와 대화하고 있니?
 
MakarFX :
나와 대화하고 있니?

네. 모든 주기와 모든 기능의 모든 세부 사항에 대해 시간 프레임을 가지고 놀아야 합니다. 그렇기 때문에다차원 배열 을 사용하는 것이 좋습니다.

 
Seric29 :

네. 모든 주기와 모든 기능의 모든 세부 사항에 대해 시간 프레임을 가지고 놀아야 합니다. 그렇기 때문에 다차원 배열 을 사용하는 것이 좋습니다.

이 질문은 더 쉽게 해결할 수 있습니다.

   switch (period)
     {
       case PERIOD_M1   : TimeFrame = PERIOD_M5 ;   break ;
       case PERIOD_M5   : TimeFrame = PERIOD_M15 ; break ;
       case PERIOD_M15 : TimeFrame = PERIOD_M30 ; break ;
       case PERIOD_M30 : TimeFrame = PERIOD_H1 ;   break ;
       case PERIOD_H1   : TimeFrame = PERIOD_H4 ;   break ;
       case PERIOD_H4   : TimeFrame = PERIOD_D1 ;   break ;
       case PERIOD_D1   : TimeFrame = PERIOD_W1 ;   break ;
       case PERIOD_W1   : TimeFrame = PERIOD_MN1 ; break ;
       case PERIOD_MN1 : TimeFrame = PERIOD_MN1 ; break ;
       default :         return ( INIT_FAILED );
     }