MQL5에서 함께 배우고 쓰기 - 페이지 25

 
Khomtchenko :

내가 어디 잘못 갔어. 내가 더 많은 직위를 받는 이유.

그런 것이 있습니다 - 그물이 호출됩니다. 바로 이 NETTING의 철학에 따르면 모든 단방향 트랜잭션은 포지션을 높이고 다방향 트랜잭션은 닫거나 줄이거나 반대로 합니다.

콤첸코 :
지표에 의한 확인은 다음과 같습니다. 매수 포지션이 있어야 하지만 매도 포지션이 있으면 매수를 합니다.

우리는 라인에서 결론을 내렸고, 기존 매도의 경우 새로운 매수가 기존 포지션을 마감하거나 삭감할 것임을 이해합니다.

추신

그건 그렇고 MT5의 TP와 SL은 마지막 거래에 따라 설정되어 있으므로 그들도 제어해야합니다 ...

 
molotkovsm :

특정 마법으로 모든 주문을 삭제하는 방법은 무엇입니까?

나는 이것을 위해 스페인어를 가지고 있습니다. 두 가지 기능인 check_orders는 def로 주문을 확인합니다. 마술, remove_sl 제거:

문제는 EA 로그에 다음 줄이 표시된다는 것입니다.

2011.05.11 21:40:19 거래 '726238' : 주문 취소 실패 #4375237 0.00 at 0.00000 [잘못된 요청]
저것들. 주문 삭제 요청, 이미 전송된 삭제 요청과 함께 거래 서버에 대한 추가 호출이 있습니다.

주문 목록을 위에서 아래로 반복해야 합니다. 예를 들면 다음과 같습니다.

       while (check_orders()== true )
        {
         int orders= OrdersTotal ();
         for (counter01=orders- 1 ; counter01>= 0 ; counter01--)
           {
            counter02= OrderGetTicket (counter01);
             if ( OrderGetInteger ( ORDER_MAGIC )!=magick)
               continue ;
            remove_request.action= TRADE_ACTION_REMOVE ; remove_request.order=counter02;
             if ( OrderCheck (start_request,check_result)== true )
               OrderSend (start_request,trade_result);
           }
        }
 

ЗЫ Если вы знаете инструмент то для поиска позиции совсем не нужно перебирать все позиции, достаточно воспользоваться вот этой функцией:

 bool    PositionSelect (
   string   symbol     // имя инструмента
   );

고맙습니다. 노력하겠습니다.

그건 그렇고, 나는 하나의 캐릭터를 사용합니다.

바로 이 NETTING의 철학에 따르면 모든 단방향 트랜잭션은 포지션을 높이고 다방향 트랜잭션은 닫거나 줄이거나 반대로 합니다.

알겠습니다!

우리는 라인에서 결론을 내렸고, 기존 매도의 경우 새로운 매수가 기존 포지션을 마감하거나 삭감할 것임을 이해합니다.

추신

그건 그렇고 MT5의 TP와 SL은 마지막 거래에 따라 설정되어 있으므로 그들도 제어해야합니다 ...

Mr. Interesting 님의 말씀에서 모든 것을 올바르게 이해하고 있음을 이해합니다.

같은 로트를 사용합니다. 같은 발을 사용합니다. 괜찮은. 하지만 뭔가 잘못되었습니다!

확인. 그는 두 명의 Expert Advisors를 만들어 그 차이를 보여주겠다고 약속했다. 내가 할 것이다. 모든 사람에게 최고의 모습을 보여주고 싶지 않습니다.

 

음, 존경받는 전문가 중 누가 PM의 mql4 및 mql5에 대한 동일한 전략에 대해 두 명의 Expert Advisor를 보낼 수 있습니까?

내가 뭘 잘못하고 있는지 알아내야만 하고 그게 다야. 글쎄, 다른 가격 통계는 테스트 결과를 2-3배 변경할 수 없습니다. 프로그래밍에 관한 것입니다.

Lizar , Renat , sergeev , HELP. 나는 당신에게 코드를 확인하기 위해 모든 전문가를 줄 수 있습니다. Expert Advisor는 간단하지만 효과적입니다. 여전히 개선할 수 있지만 문제의 본질이 더 명확해지도록 어드바이저를 최대한 단순화했습니다.

그리고 부주의한 발언에 대해 모두에게 사과드립니다. 부끄럽다 . 그러나 나는 모든 것을 정말로 이해하고 싶습니다!

 
관심이 있는 사람을 위해 여기에 게시하십시오.
 
Rosh :

주문 목록을 위에서 아래로 반복해야 합니다. 예를 들면 다음과 같습니다.

도움이되지 않습니다. 분명히 주문이 성공적으로 삭제 된 다음 다른 요청이 전송됩니다.

2011.05.12 16:42:57 거래 '726238' : 주문 취소 #4388299 매수 스톱 0.02 EURUSD at 1.41700 완료
2011.05.12 16:42:57 거래 '726238' : 주문 취소 #4388299 매수 스톱 0.02 EURUSD at 1.41700
2011.05.12 16:42:58 Trades '726238' : 주문 취소 실패 #4388299 buy 0.00 at 0.00000 [잘못된 요청] - 어떤 이유로 이미 구매했지만 구매 중지였습니다

 
//+------------------------------------------------------------------+
//|                                                     M2H1mql5.mq5 |
//|                              Copyright 2011, Yuriy V.Khomtchenko |
//|                                         mr.Khomtchenko@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, Yuriy V.Khomtchenko"
#property link       "mr.Khomtchenko@gmail.com"
#property version   "1.00"

MqlRates price[ 2 ];

double m_buff_EMAs[];
double m_buff_EMAb[];
double Ask; 
double Bid; 
int N= 2 ;
double m_handle_ema1, m_handle_ema3;
extern double Lots = 0.1 ;
extern int Period_MA1= 4 ;   
extern int Period_MA3= 21 ;
bool mm = 0 ;
bool New_Bar= false ;
int const magic= 102406 ;
double Mas0, Mab0, Mas1, Mab1;

double   
         StopLoss= 200 ,                  
         TakeProfit= 3200 ;                  
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
  m_handle_ema1= iMA ( _Symbol , _Period ,Period_MA1, 0 , MODE_EMA , PRICE_CLOSE );
  m_handle_ema3= iMA ( _Symbol , _Period ,Period_MA3, 0 , MODE_EMA , PRICE_CLOSE );
 
//---
   return ( 0 );
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   GetIns();
   if (! PositionSelect ( _Symbol ))
    { 
     if (Mas0>Mab0 && Mas1<Mab1)  OpenBuy(Lots, 10 , "EUR/USD (Buy)" , 102406 );
     if (Mas0<Mab0 && Mas1>Mab1)  OpenSell(Lots, 10 , "EUR/USD (Sell)" , 102406 );
    }
   if ( PositionSelect ( _Symbol )) TryToClose();
  }
//+------------------------------------------------------------------+
void GetIns()
{
 CopyRates ( _Symbol , _Period , 0 , 2 ,price); 
 CopyBuffer (m_handle_ema1, 0 , 0 ,N,m_buff_EMAs);
 ArraySetAsSeries (m_buff_EMAs, true );
 CopyBuffer (m_handle_ema3, 0 , 0 ,N,m_buff_EMAb);
 ArraySetAsSeries (m_buff_EMAb, true );
 Mas0=m_buff_EMAs[ 0 ];
 Mas1=m_buff_EMAs[ 1 ];
 Mab0=m_buff_EMAb[ 0 ];
 Mab1=m_buff_EMAb[ 1 ];
 MqlTick last_tick; //Здесь будут храниться цены последнего пришедшего тика
 SymbolInfoTick ( _Symbol ,last_tick); //заполняем структуру last_tick последними ценами текущего символа.
 Ask=last_tick.ask; //Обновляем переменные Ask и Bid для дальнейшего использования
 Bid=last_tick.bid;
 return ;
}

//Функция открытия длинной (Long) позиции. Указываем также значения переменных по умолчанию
int OpenBuy( double volume, int slippage= 10 , string comment= "EUR/USD (Buy)" , int magic0= 102406 )
  {
   MqlTradeRequest my_trade; //объявляем структуру типа MqlTradeRequest для формирования запроса
   MqlTradeResult my_trade_result; //в этой структуре будет ответ сервера на запрос.

   //далее заполняеем все НЕОБХОДИМЫЕ поля структуры запроса.
   my_trade.action= TRADE_ACTION_DEAL ; //Установить торговый ордер на немедленное совершение сделки с указанными 
                                     //параметрами (поставить рыночный ордер)
   my_trade.symbol= Symbol (); //указываем в качестве валютной пары - текущую валютную пару 
                             //(ту, на которой запущен советник)
   my_trade.volume= NormalizeDouble (volume, 1 ); //размер лота
   my_trade.price= NormalizeDouble (Ask, _Digits ); //Цена, при достижении которой ордер должен быть исполнен. 
   //В нашем случае для TRADE_ACTION_DEAL это текущая цена и ее, согласно инструкции указывать не обязательно.
   my_trade.sl= NormalizeDouble (Ask-StopLoss* _Point , _Digits ); //стоплосс ордера (цена при которой следует закрыть 
                                                             //убыточную сделку)
   my_trade.tp= NormalizeDouble (Ask+TakeProfit* _Point , _Digits ); //тейкпрофит (цена при которой следует закрыть
                                                               // прибыльную сделку)
   my_trade.deviation=slippage; //проскальзывание в пунктах (при тестировании особой роли не играет, т.к. 
                               //проскальзывания не бывает на тестах)
   my_trade.type= ORDER_TYPE_BUY ; //тип рыночного ордера (покупаем)
   my_trade.type_filling= ORDER_FILLING_AON ; //Указываем как исполнять ордер. (All Or Nothing - все или ничего) 
   //Сделка может быть совершена исключительно в указанном объеме и по цене равной или лучше указанной в ордере.
   my_trade.comment=comment; //комментарий ордера
   my_trade.magic=magic; //магическое число ордера

   ResetLastError (); //обнуляем код последней ошибки 
   if ( OrderSend (my_trade,my_trade_result)) //отправляем запрос на открытие позиции. При этом проверяем 
                                           //успешно ли прошла отправка запроса
     {
       // Если сервер принял ордер то смортрим на результат 
  
       Print ( "Код результата операции - " ,my_trade_result.retcode);
     }
   else
     {
       //Сервер не принял ордер в нем есть ошибки, выводим их в журнал
       Print ( "Код результата операции - " ,my_trade_result.retcode);
       Print ( "Ошибка открытия ордера = " , GetLastError ());
     }
return ( 0 ); // Выходим из функции открытия ордера     
}

//функция открытия короткой (Short) позиции. Аналогична функции открытия длинной позиции.
int OpenSell( double volume, int slippage= 10 , string comment= "Open Short EUR/USD (Sell)" , int magic0= 102406 )
  {
   MqlTradeRequest my_trade;
   MqlTradeResult my_trade_result;
   my_trade.action= TRADE_ACTION_DEAL ;
   my_trade.symbol= Symbol ();
   my_trade.volume= NormalizeDouble (volume, 1 );
   my_trade.price= NormalizeDouble (Bid, _Digits );
   my_trade.sl= NormalizeDouble (Bid+StopLoss* _Point , _Digits );
   my_trade.tp= NormalizeDouble (Bid-TakeProfit* _Point , _Digits );
   my_trade.deviation=slippage;
   my_trade.type= ORDER_TYPE_SELL ;
   my_trade.type_filling= ORDER_FILLING_AON ;
   my_trade.comment=comment;
   my_trade.magic=magic;

   ResetLastError ();
   if ( OrderSend (my_trade,my_trade_result))
     {

       Print ( "Код результата операции - " ,my_trade_result.retcode);
     }
   else
     {
       Print ( "Код результата операции - " ,my_trade_result.retcode);
       Print ( "Ошибка открытия ордера = " , GetLastError ());
      }
return ( 0 );
}

int TryToClose()
{
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
       if (Mas0<Mab0 && Mas1>Mab1) OpenSell(Lots, 10 , "EUR/USD (Sell)" , 102406 );
       if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
       if (Mas0>Mab0 && Mas1<Mab1) OpenBuy(Lots, 10 , "EUR/USD (Buy)" , 102406 );
   return ( 0 );
}

비슷하지만 mql4에서:

 //+------------------------------------------------------------------+
//|                                                       H1EU2M.mq4 |
//|                             Copyright © 2011 Khomtchenko V. Yury |
//|                                         mr.Khomtchenko@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011 Khomtchenko V. Yury"
#property link       "mr.Khomtchenko@gmail.com"

 extern double Lots = 0.1 ;

 extern int Period_MA1= 4 ;    
 extern int Period_MA3= 21 ;
   bool mm = 0 ;
 bool New_Bar= false ;
   int magic= 10605 ;
 double Mas0, Mal0, Mab0, Mas1, Mal1, Mab1;
 int mt,ticket, total, mtotal, i, count, time_oc, md, refresh;
 double   
         SL= 0.002 ,                 
         kmin= 1 ,                   
         border= 500 ,
         TP= 0.032;                   
            
int       delay= 3200 , //3200
         maxr= 10 ;
int       handle;

int init()
  {
//----
 time_oc= 0 ; 
 md= 0 ; 
 refresh= 0 ;
//----
   return ( 0 );
  }

int start()
  {
//----
  GetIns();
 

  OpenBuy();
  OpenSell(); 
  
 
  CloseSellEnd();
  CloseBuyEnd();
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

int GetIns()
{
 Mas0= iMA ( NULL , 0 ,Period_MA1, 0 , MODE_EMA , PRICE_CLOSE , 0 ); //40
 Mab0= iMA ( NULL , 0 ,Period_MA3, 0 , MODE_EMA , PRICE_CLOSE , 0 ); //40
 Mas1= iMA ( NULL , 0 ,Period_MA1, 0 , MODE_EMA , PRICE_CLOSE , 1 ); //40
 Mab1= iMA ( NULL , 0 ,Period_MA3, 0 , MODE_EMA , PRICE_CLOSE , 1 ); //40
}

int OpenBuy()
{
total=Total();
  
   if (Total()< 1 ) 
     { //2
       if (Mas0>Mab0 && Mas1<Mab1 )
        { //21
        refresh= 0 ;
         while ( true ){ RefreshRates();
         Print ( "Try to open BUY H1:" ,Ask, "(" ,refresh, ")" , ", TotalOrders:" , OrdersTotal (), ", My orders:" , Total());
        refresh++;
        ticket= OrderSend ( Symbol (),OP_BUY,Lots,Ask, 50 ,Ask-SL,Ask+TP, "BUY 60" ,magic, 0 ,Green);
         if (refresh>=maxr) return ( 0 ); 
         if (ticket> 0 )
           { //22
             Print ( "BUY order opened H1: " ,Ask, ", TotalOrders:" , OrdersTotal (), ", My orders:" , Total());
            time_oc= TimeLocal ( );
            md= 0 ;
             return ( 0 );
           } //22
           continue ;  }
        } //21
      } //2
}

int OpenSell()
{
 total=Total();
       if (Total()< 1 ) 
       {
         if (Mas0<Mab0 && Mas1>Mab1)
          {
          refresh= 0 ;
           while ( true ){ RefreshRates();
           Print ( "Try to open Sell H1: " ,Bid, "(" ,refresh, ")" , ", TotalOrders:" , OrdersTotal (), ", My orders:" , Total());
           refresh++;
           ticket= OrderSend ( Symbol (),OP_SELL,Lots,Bid, 50 ,Bid+SL,Bid-TP, "SELL 60" ,magic, 0 ,Red);
           if (refresh>=maxr) return ( 0 ); 
           if (ticket> 0 )
             {
               Print ( "SELL order opened H1: " ,Bid, ", TotalOrders:" , OrdersTotal (), ", My orders:" , Total());
              time_oc= TimeLocal ( );
              md= 0 ;
               return ( 0 );
             } 
           continue ;  }
          }
        }
}

int CloseBuyEnd()
{
if (Total()> 0 )
     { //3
     mtotal= OrdersTotal ();
     for (i= 0 ; i<mtotal; i++)
      { //for
       if ( OrderSelect (i,SELECT_BY_POS)== true )
       { //31
       if (OrderType()==OP_BUY && OrderMagicNumber()==magic) // check for long position (BUY) close possibility
        { //32
         if (Mas0<Mab0 && Mas1>Mab1) //70
          { //33
          refresh= 0 ;
           while ( true ){ RefreshRates();
          refresh++;
          ticket=OrderClose(OrderTicket(),OrderLots(),Bid, 50 ,Red);
           if (refresh>=maxr) return ( 0 );
           if (ticket> 0 )
           { //331
             Print ( "BUY order CLOSED (TP): " ,OrderClosePrice());
            time_oc= 0 ;
            md= 0 ;
             return ( 0 );
           } //331
           continue ;  }
           } //33
         } //32 
        } //31
        } //for
     } //3
}

int CloseSellEnd()
{
mtotal= OrdersTotal ();
if (Total()> 0 )
     { //3
     for (i= 0 ; i<mtotal; i++)
      { //for
       if ( OrderSelect (i,SELECT_BY_POS)== true )
       { //31
       if (OrderType()==OP_SELL && OrderMagicNumber()==magic) // check for long position (SELL) close possibility
         { //32
           if (Mas0>Mab0 && Mas1<Mab1) //70
          { //33
          refresh= 0 ;
           while ( true ){ RefreshRates();
          refresh++;
           ticket=OrderClose(OrderTicket(),OrderLots(),Ask, 50 ,Green);
           if (refresh>=maxr) return ( 0 );
             if (ticket> 0 )
             { //351
               Print ( "SELL order closed (TP): " ,OrderClosePrice()); 
              time_oc= 0 ;
              md= 0 ;
               return ( 0 );
             } //351
             continue ;  }
          } //33
         } //32 
        } //31
        } //for
     } //3  
}

int Total()
{
 count= 0 ;
 for (i= 0 ;i< OrdersTotal ();i++)
  {
   OrderSelect (i,SELECT_BY_POS);
   if (OrderMagicNumber( )==magic) {count++;}
  }
 return (count);
}

글쎄,보고 비교하십시오. 어딘가에 내가 망쳤어 ... 그 차이는 중요합니다.

 
molotkovsm :

도움이되지 않습니다. 분명히 주문이 성공적으로 삭제 된 다음 다른 요청이 전송됩니다.

2011.05.12 16:42:57 거래 '726238' : 주문 취소 #4388299 매수 스톱 0.02 EURUSD at 1.41700 완료
2011.05.12 16:42:57 거래 '726238' : 주문 취소 #4388299 매수 스톱 0.02 EURUSD at 1.41700
2011.05.12 16:42:58 Trades '726238' : 주문 취소 실패 #4388299 buy 0.00 at 0.00000 [잘못된 요청] - 어떤 이유로 이미 구매했지만 구매 중지였습니다.

부끄럽지만 아직 텔레파시 기술을 마스터하지 못했습니다.
 
나는 거의 잊었다. 전문가 고문은 Eur/Usd H1에서 일합니다. 2010년 1월 1일부터 2011년 1월 5일까지 테스트했습니다.
 
Rosh :
부끄럽지만 아직 텔레파시 기술을 마스터하지 못했습니다.

질문을 반복하겠습니다.

특정 마법으로 모든 주문을 삭제하는 방법은 무엇입니까?

나는 이것을 위해 스페인어를 가지고 있습니다. 두 가지 기능인 check_orders는 def로 주문을 확인합니다. 마법과 remove_sl 제거:

 void remove_sl()
     {
       int counter01;
       ulong counter02;
       while (check_orders()== true )
        {
         for (counter01= 0 ; counter01< OrdersTotal (); counter01++)
           {
            counter02= OrderGetTicket (counter01);
             if ( OrderGetInteger ( ORDER_MAGIC )!=magick)
               continue ;
            remove_request.action= TRADE_ACTION_REMOVE ; remove_request.order=counter02;
             if ( OrderCheck (start_request,check_result)== true )
               OrderSend (start_request,trade_result);
           }
        }
     }



bool check_orders()
     {
       int counter01;
       bool order_exist= false ;
       for (counter01= 0 ; counter01< OrdersTotal (); counter01++)
        {
         OrderGetTicket (counter01);
         if ( OrderGetInteger ( ORDER_MAGIC )==magick)
           {
            order_exist= true ;
             break ;
           }
        }
       return (order_exist);
     }

문제는 EA 로그에 다음 줄이 표시된다는 것입니다.

2011.05.11 21:40:19 거래 '726238' : 주문 취소 실패 #4375237 0.00 at 0.00000 [잘못된 요청]
저것들. 주문 삭제 요청과 함께 거래 서버에 대한 추가 요청이 있습니다. 삭제 요청은 이미 전송되었습니다.

다음을 제안하셨습니다.

주문 목록을 위에서 아래로 반복해야 합니다. 예를 들면 다음과 같습니다.

 while (check_orders()== true )
        {
         int orders= OrdersTotal ();
         for (counter01=orders- 1 ; counter01>= 0 ; counter01--)
           {
            counter02= OrderGetTicket (counter01);
             if ( OrderGetInteger ( ORDER_MAGIC )!=magick)
               continue ;
            remove_request.action= TRADE_ACTION_REMOVE ; remove_request.order=counter02;
             if ( OrderCheck (start_request,check_result)== true )
               OrderSend (start_request,trade_result);
           }
        }

말씀하신 대로 하려고 했지만 문제가 남아 있습니다. 보류 중인 주문 이 먼저 삭제된 다음 동일한 주문을 삭제하라는 또 다른 요청이 전송됩니다. 다음은 로그에 있는 줄의 예입니다.

2011.05.12 16:42:57 거래 '726238' : 주문 취소 #4388299 1.41700에서 0.02 EURUSD 매수 정지 완료 - 주문이 성공적으로 삭제됨
2011.05.12 16:42:57 거래 '726238' : 주문 취소 #4388299 1.41700에서 0.02 EURUSD 매수 정지 - 다른 요청 보내기
2011.05.12 16:42:58 Trades '726238' : 주문 취소 실패 #4388299 buy 0.00 at 0.00000 [잘못된 요청] - 어떤 이유로 이미 구매했지만 구매 중지였습니다

이것은 매번 발생하는 것은 아니지만 가끔 발생하며 Expert Advisor의 작동에 영향을 미치지 않습니다. 빈 요청으로 거래 서버를 로드하지 않고 모든 것을 올바르게 하고 문제를 파악하고 싶습니다.

답변과 기꺼이 도와주셔서 감사합니다.


Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5