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

 
Snajper007 매도 주문이 열렸을 때 평균 가격이 나온 함수입니다. 하지만 3차 오더가 열리면 함수는 이전 값과 새 값을 모두 제공하므로(잡지의 인쇄물을 봤습니다) 결과적으로 이전 값이 유지됩니다. 그가 무엇을 잘못했습니까?
 //+----------------------------------------------------------------------------+
//| Расчет среденй цены (0)-buy (1)-sell                                       |
//+----------------------------------------------------------------------------+
double GetAveragePrice( int ot=- 1 )
  {
   double order_lots = 0 , order_price = 0 , avg_price = 0 ;
     {
       for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
        {
         if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
           {
             if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
              {
               if (OrderType()==ot||ot< 0 )
                 {
                  order_lots += OrderLots();
                  order_price += OrderOpenPrice() * OrderLots();
                 }
              }
           }
        }
     }
   avg_price = NormalizeDouble (order_price / order_lots, Digits );
   return (avg_price);
  }
//+----------------------------------------------------------------------------+
 
MakarFX # :
고맙습니다!
 
좋은 오후입니다. 지표별로 거래를 시작하기 위한 필터를 구현하는 데 누가 도움을 줄 수 있습니까?
 
Sergei Pimenov # :
좋은 오후입니다. 지표를 기반으로 거래를 시작하기 위한 필터를 구현하는 데 누가 도움을 줄 수 있습니까?
 

논리 개선을 도와주세요. 마감된 주문과 새로운 주문이 시작되는 사이에는 몇 시간의 일시 중지가 필요합니다. 뭔가 있어. 하지만 작동하지 않습니다.

OrderCloseTime() > 0 && TimeCurrent () - OrderCloseTime() > FstOrderTimeHour* 3600 // сигнал на открытие ордера

OrderCloseTime() == 0 // сигнал на открытие первого ордера

где int FstOrderTimeHour = 1 // пауза в часах
 
Порт-моне тв # :

논리 개선을 도와주세요. 마감된 주문과 새로운 주문이 시작되는 사이에는 몇 시간의 일시 중지가 필요합니다. 뭔가 있어. 하지만 작동하지 않습니다.

 //--- input parameters
input int HourPause = 1 ;   // Пауза в часах
//--- global parameters
datetime   pause;
//+------------------------------------------------------------------+
void OnTick()
  {
   pause=GetInfoLastPos( 3 )+(HourPause* 60 * 60 );
   // выключаем торговлю
   if ( TimeCurrent ()<pause) return ;
  .......
  }
//+----------------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                             MakarFX|
//|  1 - размер лота последней закрытой позиции                                |
//|  2 - размер профита с учетом комиссии и свопа последней закрытой позиции   |
//|  3 - время последней закрытой позиции                                      |
//+----------------------------------------------------------------------------+
double GetInfoLastPos( int a= 1 )
  {
   datetime t= 0 ;
   double result= 0 ,l= 0 ,p= 0 ,f= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic )
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); l=OrderLots(); p=OrderProfit()+OrderCommission()+OrderSwap();}
              }
           }
        }
     }
   if (a== 1 ) {result=l;} else
   if (a== 2 ) {result=p;} else
   if (a== 3 ) {result=( double )t;}
   else      {result= 0 ;}
   return (result);
  }
//+----------------------------------------------------------------------------+

마술사가 필요하지 않은 경우 - 노란색 기량.

 
MakarFX # :

주문을 열기 전에 prev_ticket의 현재 max_ticket을 기억합니다.

Makar님, 마지막에서 두 번째 순서의 티켓을 결정하는 이 방법에는 심각한 단점이 있습니다. 이 방법은 그리드의 최대 차수가 열릴 때 작동하며 이것이 발생하지 않으면 끝에서 두 번째 순서는 마지막 순서와 같습니다. 그림을 참조하십시오. 함수를 작성하려고 하는데 마지막 티켓에 의해 넌센스가 결정되는 것으로 나타났습니다. 선택한 조건이 작동하지 않습니다.

 //+----------------------------------------------------------------------------+
//| Расчет тикета предпоследнего ордера в сетке                                 |
//+----------------------------------------------------------------------------+
int GetTicketPenultimateOrder()
  {
   penultimate_ticket = 0 ;
     {
       for ( int cnt = OrdersTotal () - 1 ; cnt >= 0 ; cnt--)
        {
         if ( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES))
           {
             if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
              {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                 {
                   if (OrderTicket() > penultimate_ticket)
                     if (penultimate_ticket < GetTicketMaxOrder())
                        penultimate_ticket = OrderTicket();

                 }
              }
           }
        }
     }
   return (penultimate_ticket);
  }

 
EVGENII SHELIPOV # :

Makar님, 마지막에서 두 번째 순서의 티켓을 결정하는 이 방법에는 심각한 단점이 있습니다. 이 방법은 그리드의 최대 차수가 열릴 때 작동하며 이것이 발생하지 않으면 끝에서 두 번째 순서는 마지막 순서와 같습니다. 그림을 참조하십시오. 함수를 작성하려고 하는데 마지막 티켓에 의해 넌센스가 결정되는 것으로 나타났습니다. 선택한 조건이 작동하지 않습니다.

나는 당신에게 작동 코드 를 주었다!
 
MakarFX # :
나는 당신에게 작동 코드 를 주었다!

이 코드를 사용하면 위에서 작성한 모든 일이 발생하고 사진을 첨부하기도 합니다.

 
EVGENII SHELIPOV # :

이 코드를 사용하면 위에서 작성한 모든 일이 발생하고 사진을 첨부하기도 합니다.

오류는 끝에서 두 번째 검색 코드에 있는 것이 아니라 정보를 텍스트로 출력하는 데 있을 가능성이 가장 높습니다.