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

 

안녕하세요.

MT4에서 어드바이저와 거래할 때 코드를 올바르게 작성하는 방법을 알려주십시오. 저 자신도 프로그래밍이 처음입니다.

나는 마지막으로 마감된 주문을 선택하고 조건에 따라 이익을 비교해야 합니다. 주문의 이익이 0보다 크면 할 일이 없고, 0보다 작으면 뭔가를 하십시오.

 double GetSizeLot( double lastlot= 0 ) //Функция возвращает значение лотов 
  {
   double Lot2,MinLots,MaxLots;
   int j=OrdersHistoryTotal();
   
   MinLots=Lots;
   MaxLots=MaxLot;
   if (!DynamicLot)Lot2=Lots;
   if (lastlot<Lot2)lastlot=Lot2;
   
   if ( OrderSelect (j,SELECT_BY_POS,MODE_HISTORY))
     {
     if (OrderProfit()< 0 ) lastlot=lastlot*Martin;
     if (OrderProfit()> 0 ) lastlot=Lot2;
     }
   Lot2=lastlot;
   if (Lot2 < MinLots) Lot2 = MinLots;
   if (Lot2 > MaxLots) Lot2 = MaxLots;
   return ( NormalizeDouble (Lot2, 2 ));
  }

진심으로, 알렉산더.

 
Menshikov :

안녕하세요.

MT4에서 어드바이저와 거래할 때 코드를 올바르게 작성하는 방법을 알려주십시오. 저 자신도 프로그래밍에 매우 익숙하지 않습니다.

나는 마지막으로 마감된 주문을 선택하고 조건에 따라 이익을 비교해야 합니다. 주문의 이익이 0보다 크면 할 일이 없고, 0보다 작으면 뭔가를 하십시오.

진심으로, 알렉산더.

 //+------------------------------------------------------------------+

datetime time= 0 ; double profit= 0 ,lots= 0 ;
for ( int i=OrdersHistoryTotal()- 1 ; i>= 0 ; i--)
   if ( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY))
       if (OrderSymbol()== _Symbol )
         if (OrderMagicNumber()==MagicNumber || MagicNumber==- 1 )
             if (OrderCloseTime()>time) // находим последний в истории ордер
              {
               time=OrderCloseTime(); // запомним время
               profit=OrderProfit();   // запомним профит
               his_lt=OrderLots();     // запомним лот
              }

if (profit< 0 ) //если профит меньше нуля
   lots=his_lt* 2 ; // Увеличим в два раза

//+------------------------------------------------------------------+
 
Vladimir Pastushak :
정말 감사합니다.
 
Vladimir Pastushak :
흥미롭게도 목록의 마지막 시간을 선택하고 심지어 사이클까지 선택하면 시간이 무엇인지, 왜 닫는 시간을 기억합니까? 그리고 스왑과 커미션을 고려하지 않는 이유는 무엇입니까? OrderProfit()>0인 경우에도 실제 이익은 음수일 수 있습니다. 주문 목록으로 직접 작업하는 경우 마지막 마감 시간에 대한 검색 주기 코드의 일부를 남겨 둘 필요도 없습니다. 한 가지 - 신뢰성과 자신감, 또는 속도입니다. 그리고 당신은 혼합이 있습니다.
 
Artyom Trishkin :
흥미롭게도 목록의 마지막 시간을 선택하고 심지어 사이클까지 선택하면 시간이 무엇인지, 왜 닫는 시간을 기억합니까? 그리고 스왑과 커미션을 고려하지 않는 이유는 무엇입니까? OrderProfit()>0인 경우에도 실제 이익은 음수일 수 있습니다. 주문 목록으로 직접 작업하는 경우 마지막 마감 시간에 대한 검색 주기 코드의 일부를 남겨 둘 필요도 없습니다. 한 가지 - 신뢰성과 자신감, 또는 속도입니다. 그리고 당신은 혼합이 있습니다.

당신은 제공하고 있습니다

   if ( OrderSelect (OrdersHistoryTotal(),SELECT_BY_POS,MODE_HISTORY))

그렇게 합니까?

그 남자는 이익 주문만 요구했는데 왜 그들이 요구하지 않은 것을 귀찮게합니까? 하지만 동의합니다....

 

MT4의 MQL4에서 20개 바 후에 미결 주문을 마감하는 방법, 즉 주문을 여는 방법과 20개의 새 바가 나타나는 방법 - 주문이 마감되는 방법을 알려주세요. (항상 1개의 주문만 열려 있습니다). 어떤 이유에서인지 이 코드는 전략 테스터 에서 작동하지 않지만 작동하려면 필요합니다.


이 코드의 의미는 다음과 같습니다. 미결 주문이 있는지 확인하고, 없으면 주문을 열고 첫 번째 막대의 시작 가격을 변수 "z"에 쓴 다음 각 틱으로 시작 가격을 확인합니다. 20번째 막대이고 시간이 지남에 따라 동일한 1번째 막대가 20번째 막대가 되면 해당 가격은 "z" 변수에 기록된 가격과 일치하고 그 후에 주문이 마감됩니다. (물론 이 과정에서 가격이 일치하는 경우가 있을 수 있지만 이것은 매우 드물며, 게다가 변수에 첫 번째 막대의 매개변수를 몇 개 더 쓸 수도 있습니다)


 double z; //объявление переменной

           //ОТКРЫТИЕ ОРДЕРА
           if ( OrdersTotal () == 0 ) // если нет открытых ордеров то открывать ордер
              {
               OrderSend ( Symbol (), OP_SELL, 0.1 , Bid, 3 , Bid+ 150 * Point , Bid- 10 * Point );
                   z = Open[ 1 ]; // здесь переменной "z" присваивается цена открытия 1-го бара
              }
             else

           Print ( "ORDER NE USTANOVLEN!!!" );




           //ЗАКРЫТИЕ ОРДЕРА

     if (z==Open[ 20 ])   //если цена записанная в переменную "z" равна цене 20-го бара, то закрывать ордер
        {
           

             //-----------------код закрывает все ордера--------------------
   bool    result;
   int     error;

 while ( OrdersTotal ()> 0 )
 {
   if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES))
     {   if (OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble (MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)), 3 ,CLR_NONE);
           if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble (MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)), 3 ,CLR_NONE);
           if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
         
           if (result!=TRUE) { error= GetLastError ();
               Print ( "LastError = " ,error, " " , Symbol ()); }
           else error= 0 ; }
   else Print ( "Error when order select " , GetLastError ());

  }
//------------конец кода закрывающего ордер------------------
           
           
        }
       else
       Print ( "ORDER NE ZAKRYT!!!" );
 
BEGEMOT32 :

MT4의 MQL4에서 20개 바 후에 미결 주문을 마감하는 방법, 즉 주문을 여는 방법과 20개의 새 바가 나타나는 방법 - 주문이 마감되는 방법을 알려주세요. (항상 1개의 주문만 열려 있습니다). 어떤 이유에서인지 이 코드는 전략 테스터 에서 작동하지 않지만 작동하려면 필요합니다.


이 코드의 의미는 다음과 같습니다. 미결 주문이 있는지 확인하고, 없으면 주문을 열고 첫 번째 막대의 시작 가격을 변수 "z"에 쓴 다음 각 틱으로 시작 가격을 확인합니다. 20번째 막대이고 시간이 지남에 따라 동일한 1번째 막대가 20번째 막대가 되면 해당 가격은 "z" 변수에 기록된 가격과 일치하고 그 후에 주문이 마감됩니다. (물론 이 과정에서 가격이 일치하는 경우가 있을 수 있지만 이것은 매우 드물며, 게다가 변수에 첫 번째 막대의 매개변수를 몇 개 더 쓸 수도 있습니다)


모든 것, 나는 그것을 스스로 알아 냈습니다. int start () 외부에서 변수를 선언해야했습니다. 이제 제대로 작동합니다.
 
BEGEMOT32 :
모든 것, 나는 그것을 스스로 알아 냈습니다. int start () 외부에서 변수를 선언해야했습니다. 이제 제대로 작동합니다.

나는 그것을 조금 단순화했지만 당신의 코드에는 여전히 오류가 있습니다

 //ОТКРЫТИЕ ОРДЕРА
if ( OrdersTotal ()== 0 ) // если нет открытых ордеров то открывать ордер
   if ( OrderSend ( Symbol (),OP_SELL, 0.1 ,Bid, 3 ,Bid+ 150 * Point ,Bid- 10 * Point )< 0 )
       Print ( "ORDER NE USTANOVLEN!!!" );

//-----------------код закрывает все ордера--------------------
   bool    result;
   int     error;
   while ( OrdersTotal ()> 0 )
     {
       if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES))
        {
         if (iBarShift(OrderSymbol(), Period (),OrderOpenTime())== 20 )
           {
             if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble (MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)), 3 ,CLR_NONE);
             if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble (MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)), 3 ,CLR_NONE);
             if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
               OrderDelete(OrderTicket());
           }
         if (result!=TRUE)
           {
            error= GetLastError ();
             Print ( "LastError = " ,error, " " , Symbol ());
           }
         else error= 0 ;
        }
       else Print ( "Error when order select " , GetLastError ());

     }
 

다중 통화 어드바이저를 작성 중이지만 어드바이저를 다른 통화에 걸면 동시에 다른 가격을 반환하는 이유를 이해할 수 없습니다.

간단히 코드에서:

초기화에서

 EventSetTimer ( 60 );

OnTimer()

 MqlTick last_tick;
if ( SymbolInfoTick ( "EURNZD" ,last_tick))
{
    Print ( "Last Ask: " , last_tick.ask);
}

EURNZD에서 고문을 테스트하면 예를 들어

2015.05.18 00:07:00 LatAsk : 1.5370

내가 다른 통화 쌍에 고문을 매달면

2015.05.18 00:07:00 LatAsk : 1.5323

값은 근본적으로 다르며 두 번째 경우 일정에 따라 이러한 값은 적어도 몇 시간이 될 수 없습니다.

테스터에서 모든 틱은 거래 모드에 있으며 메인 쌍이 아닌 것처럼 느껴지며 테스터의 값은 대략적입니다.

나는 이것이 Meta Trade 5 라는 것을 추가하는 것을 잊었습니다.

처음 출시할 때 가격이 틀려 다시 테스트를 해보니 가격이 정상

 
1. 틱 볼륨 에 몇 개의 위아래 틱이 있었는지 기록에서 알 수 있습니까?

2. autochartis를 삭제한지 몇개월이 지났는데 로그에 메시지가 나타납니다. 프로그램이 계속 파일을 열려고 합니다.

autochartis를 완전히 지우는 방법?

2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Volatility.ex4' [2]
2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Key Levels.ex4' [2]
2015.05.25 15:36:42.982 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Chart Patterns.ex4' [2]

사유: