[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 3. - 페이지 202

 
Vinin :

또는 고문의 도움을 받아 활성 도구 목록을 만들 수도 있습니다. 접근 방식이 다소 복잡합니다. 해결이 더 쉬울까요
단순히 입력 매개변수에 숫자를 지정하는 것이 가능하지만 사실 거래 과정에서 일부 통화에 대한 거래가 중단되는 상황이 발생할 수 있습니다. 그런 다음 다른 사람의 고문은 매개변수를 다시 계산해야 합니다.
 
forexnew :
단순히 입력 매개변수에 숫자를 지정하는 것이 가능하지만 사실 거래 과정에서 일부 통화에 대한 거래가 중단되는 상황이 발생할 수 있습니다. 그런 다음 다른 사람의 고문은 매개변수를 다시 계산해야 합니다.

표시하는 이유. 조언자는 스스로 얻을 수 있습니다. 동시에 그는 다른 고문을 관리할 수 있습니다. 그것은 모두 작업에 달려 있습니다.
 

Figar0:

В самой функции ошибок нет, наверно ошибки возникают при попытке ее использовать, но это вы нам не показываете. Выкладывайте то что не компилится прямо файлом и гадать будет не надо.

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
double Lots()      // Расчет используемого лота
  {
   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
     return(Lots);
  }
//+------------------------------------------------------------------+  

// to simplify the coding and speed up access
// data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.
 
Vinin :

표시하는 이유. 조언자는 스스로 얻을 수 있습니다. 동시에 그는 다른 고문을 관리할 수 있습니다. 그것은 모두 작업에 달려 있습니다.

다른 고문 관리에 대해서는 잘 모릅니다. 모든 통화 쌍에 대해 단 하나의 고문이 있으며 패턴은 다음과 같습니다.

2개의 통화 쌍이 있는 경우: 첫 번째에는 - 2, 두 번째에는 - 1이 표시됩니다.

3개의 통화 쌍이 있는 경우: 첫 번째에는 - 3, 두 번째에는 2, 세 번째에는 1이 표시됩니다.

4개의 통화 쌍이 있는 경우: 첫 번째에는 - 4, 두 번째에는 3, 세 번째에는 2, 네 번째에는 1이 표시됩니다.

첫 번째 통화에 대해 계산된 내용이 다른 통화 쌍의 고문에 의해 고려되지 않은 것 같거나 어떻게든 열려 있는 창(통화 쌍)의 수에 따라 달라지나요?

 
Vinin :

표시하는 이유. 조언자는 스스로 얻을 수 있습니다. 동시에 그는 다른 고문을 관리할 수 있습니다. 그것은 모두 작업에 달려 있습니다.
고맙습니다. 이미 스스로 알아 냈습니다. 라인을 제거하고 1에서 kp를 계산하면 됩니다.
 if ( OrderSymbol ()== Symbol ())   break ;
 
skyjet :

먼저 시작 함수 안에 로트 계산 함수가 선언되어 있습니다. 그녀를 꺼내 그러면 선언되지 않은 변수에 약간의 오류가 있을 수 있지만 네, 직접 처리할 것이라고 생각합니다.
 
skyjet :
로트 계산에서 NormalizeDlouble()이란 무엇입니까?

소수점 뒤에 두 자리가 있어야 합니다. 그렇지 않으면 0.009가 많은 위치가 열리지 않습니다. 최소 로트 단계의 배수가 아닙니다.

   double Lots;
   Lots= AccountFreeMargin ()/ 10000 * 5 ;
   Lots= MathMin ( 15 , MathMax ( 0.1 ,Lots));
   if (Lots< 0.1 ) 
     Lots= NormalizeDouble (Lots, 2 );
   else
     {
     if (Lots< 1 ) Lots= NormalizeDouble (Lots, 1 );// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     else        Lots= NormalizeDouble (Lots, 0 );// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     } 

 

얘들아!

증가된 로트로 매 40번째 주문을 만드는 방법은 무엇입니까? :: 시장 및 이연

어쩌면 그렇게?

 int Nom = OrderTicket ();                         // Номер ордера

a= Nom% 40 ;                                       // к-во делить на 40 без остатка
if a = 0
lot = 2 ;  

 
 
Figar0 :

먼저 시작 함수 안에 로트 계산 함수가 선언되어 있습니다. 그녀를 꺼내 그러면 선언되지 않은 변수에 약간의 오류가 있을 수 있지만 네, 직접 처리할 것이라고 생각합니다.
도와 주셔서 감사합니다.
 
DDFedor :
스카이젯 :
로트 계산에서 NormalizeDlouble()이란 무엇입니까?

소수점 뒤에 두 자리가 있어야 합니다. 그렇지 않으면 0.009가 많은 위치가 열리지 않습니다. 최소 로트 단계의 배수가 아닙니다.

설명해주셔서 감사합니다.