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

 
trader781 :
#property strict


//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
extern double Lots= 0.01 ; //Oбьем открываемого ордера
extern double Martin= 2 ;
extern int     Step= 200 ;
extern int     TakeProfit= 250 ;

extern const string Настройки_работы_советника= "" ;

int Period1= 6 ; //Период 1МА
ENUM_APPLIED_PRICE PRICE1= PRICE_MEDIAN ;             // 1МА По цене

int Period2= 50 ; //Период 2МА
ENUM_APPLIED_PRICE PRICE2= PRICE_MEDIAN ;             // 2МА По цене

int Period3= 800 ; //Период 3МА
ENUM_APPLIED_PRICE PRICE3= PRICE_MEDIAN ;             // 3МА По цене

int Period4= 25 ; //Период 4МА
ENUM_APPLIED_PRICE PRICE4= PRICE_MEDIAN ;             // 4МА По цене, вспомогательная

uint   X= 20 ;                                                 // отклонение от ма, пунктов
int    i;                                                   // исходный счетчик ордеров
bool   dummy;                                               // для выхода функций в переменную
int    ticket;                                             // тикет открываемого ордера
int    Magic= 444 ;                                           // Magic Number
int    lastlot,tp;
double price;
int     count;
int     otype;



int OnInit ()
  {
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
  }
void OnTick ()
  {
     {
       if ( Bars < 801 ) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         return ;
     }
//+----------------------------------------------------------------Сборник параметров индикаторов

   double ma1= NormalizeDouble ( iMA ( NULL , 0 ,Period1, 0 , MODE_SMA ,PRICE1, 1 ), 5 );   //+----6

   double ma2= NormalizeDouble ( iMA ( NULL , 0 ,Period2, 0 , MODE_SMA ,PRICE2, 1 ), 5 );   //+----50

   double ma3= NormalizeDouble ( iMA ( NULL , 0 ,Period3, 0 , MODE_SMA ,PRICE3, 1 ), 5 );   //+----800

   double ma31= NormalizeDouble ( iMA ( NULL , 0 ,Period3, 0 , MODE_SMA ,PRICE3, 10 ), 5 );   //+----800
   double ma32= NormalizeDouble ( iMA ( NULL , 0 ,Period3, 0 , MODE_SMA ,PRICE3, 20 ), 5 );   //+----800
   double ma33= NormalizeDouble ( iMA ( NULL , 0 ,Period3, 0 , MODE_SMA ,PRICE3, 30 ), 5 );   //+----800

   double ma4= NormalizeDouble ( iMA ( NULL , 0 ,Period4, 0 , MODE_SMA ,PRICE4, 0 ), 5 );   //+----25
//+-----------------------------------------------------------------  Открытие ордеров по 25-50 ма

//+-------------------------------------------------- открыть ордер

   if (Counts()== 0 )               //+-------------если количество ордеров равно 0
     {
       if (( MathAbs (ma2-ma4)> 30 * _Point )
         && ( MathAbs ( Bid -ma3)> 100 * Point ())
         && (ma31>ma32>ma33)) //+-----покупка по 6+50
        {
         ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 0 , 0 , 0 , "" ,Magic, 0 , clrAzure ); //+-------------отправка 1 ордера
        }
       if (( MathAbs (ma2-ma3)> 30 * _Point )) //+-------------условие продажи
        {
         ticket= OrderSend ( Symbol (), OP_SELL ,Lots, Bid , 0 , 0 , 0 , "" ,Magic, 0 , clrAzure ); //+-------------отправка 1 ордера
        }
         if (ticket== 0 )
            {
             return ;
            }
     }
    
       else        //+------------если уже есть
    
        {
         if (FindLastOType()== OP_BUY )
           {
          
             if ( Ask <=FindLastOrderOpenPrice()-Step* Point ())
              {
               ticket= OrderSend ( Symbol (), OP_BUY ,(FindLastLot()*Martin), Ask , 0 , 0 , 0 , "" ,Magic, 0 , clrAzure );
               ModifyOrders();
               myOrdersCloseTotal();
              }
           }

         if (FindLastOType()== OP_SELL )
           {
          
             if ( Bid >=FindLastOrderOpenPrice()+Step* Point ())
              {
               ticket= OrderSend ( Symbol (), OP_SELL ,(FindLastLot()*Martin), Bid , 0 , 0 , 0 , "" ,Magic, 0 , clrAzure );
               ModifyOrders();
               myOrdersCloseTotal();
              }
           }
        }
     }
  
//+-------------------------------------------------------------количество ордеров в рынке

int Counts()
  {
   count= 0 ;
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) //   цикл будет работать пока не останется ордеров
     {
       if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && ( OrderSymbol ()== Symbol ()) && ( OrderMagicNumber ()==Magic))
        {
         if (( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) && ( OrderTicket ()==ticket))
            count++;
        }
     }
   return (count);
  }
//+---------------------------------------------------------------найти тип последнего ордера
int FindLastOType()
  {
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) //   цикл будет работать пока не останется ордеров
     {
       if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==Magic))
        {
         if (( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) && ( OrderTicket ()==ticket))
             return ( OrderType ());
        }
     }
   return (- 1 );
  }
//+--------------------------------------------------------------вернуть цену последнего открытого ордера

double FindLastOrderOpenPrice()

  {
   int     oldticket;
   ticket= 0 ;
   double oldorderopenprice= 0 ;
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) //   цикл будет работать пока не останется ордеров
     {
       if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==Magic) && ( OrderType ()< 2 ))
        {

         oldticket= OrderTicket ();
         if (oldticket>ticket)
           {
            ticket=oldticket;
            oldorderopenprice= OrderOpenPrice ();
           }
        }

     }
   return (oldorderopenprice);
  }
//+--------------------------------------------------------------вернуть объем последнего ордера
double FindLastLot()
  {
   int oldticket;
   ticket= 0 ;
   double oldlots= 0 ;
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) //   цикл будет работать пока не останется ордеров
     {
       if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && OrderSymbol ()== Symbol () && ( OrderMagicNumber ()==Magic)
      && ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ))
        {
         oldticket= OrderTicket ();
         if (oldticket>ticket)
           {
            ticket=oldticket;
            oldlots= OrderLots ();
           }

        }

     }
   return (oldlots);
  }
   //+---------------------------------------------------------закрыть все если хоть один из серии закрылся
  
   int myOrdersCloseTotal()


  {
   int myOrderS= 0 ;
   for (i= OrdersTotal ()- 1 ; i> 0 ; i--)
     {
       if ((( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))== true ) && OrderSymbol ()== Symbol () && ( OrderType ()< 2 ))
        {
         myOrderS= OrdersTotal ();
        }
         else
        dummy=( OrderClose ( OrderTicket (), OrderLots (), Bid , 0 ,White));
     }

   return (myOrderS);
  }

  
  
  
//+------------------------------------------------модификация существующих расчет тейка по средней цене
void ModifyOrders()
  {
   bool    z= true ;
   double avg_price= 0 ;
   price= 0 ;
   double orderlots= 0 ;
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && ( OrderSymbol ()== Symbol ())
      && ( OrderMagicNumber ()==Magic) && (FindLastOType()== OP_BUY ))
        {
         price=( OrderOpenPrice ()* OrderLots ());
         orderlots=FindLastLot();
         avg_price= NormalizeDouble (price/orderlots, Digits );
         tp=(avg_price+TakeProfit* Point ()); //+------------------------------------тут деление на 0 второго ордера
         z= OrderModify ( OrderTicket (), OrderOpenPrice (), 0 ,tp, 0 );
         if (!z)
         Print ( "Ошибка функции модифицирования" );
        }
     }

   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if (( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) && ( OrderSymbol ()== Symbol ())
      && ( OrderMagicNumber ()==Magic) &&(FindLastOType()== OP_SELL ))
       {
         price=( OrderOpenPrice ()* OrderLots ());
         orderlots=FindLastLot();
         avg_price= NormalizeDouble (price/orderlots, Digits );
         tp=(avg_price-TakeProfit* Point ());   //+------------------------------------тут деление на 0 второго ордера
         z= OrderModify ( OrderTicket (), OrderOpenPrice (), 0 ,tp, 0 );
         if (!z)
         Print ( "Ошибка функции модифицирования" );
       }
  
  
     }
    

  }







/*    
      
*/

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

와, 잘했어

그리고 이제 컴파일러가 맹세하는 그 라인.

 
trader781 :

이 사회에 끼어들고 싶지 않은데 계산에서 0이 어디에서 오는지 아무도 알려주지 않았습니까?

포스트 413

유형 변환으로 인한 데이터 손실 가능성 count.mq4 231 12

유형 변환으로 인한 데이터 손실 가능성 count.mq4 246 12

TP와 로트를 정수 변수에 쓰면 안된다는 것을 이해하지 못하셨나요? 왜 그런 겁니까?
 
Vitalie Postolache :
TP와 로트를 정수 변수에 쓰면 안된다는 것을 이해하지 못하셨나요? 왜 그런 겁니까?


이런 식으로 올바르게 쓰는 방법을 볼 수 있습니까?

 
Artyom Trishkin :
다시 한 번 묻겠습니다. 지난 1시간 동안 TF H1의 표시기에서 무슨 일이 일어났는지 알고 싶습니까? 아니면 주어진 시간에 TF H1의 표시기에서 무슨 일이 일어나고 있는지 알고 싶습니까?

첫 번째 닫힌 막대 H1에 표시기 값이 필요합니다.

 
trader781 :


이런 식으로 올바르게 쓰는 방법을 볼 수 있습니까?

초등학교.
int    lastlot,tp;
double    lastlot,tp;
 
trader781 :


이런 식으로 올바르게 쓰는 방법을 볼 수 있습니까?

double tp;
double 유형 의 tp 변수 선언
 
Vitalie Postolache :
.
알렉세우 페도토프 :

덕분에 오류가 사라졌습니다. 그러나 봇은 터미널과 함께 실행될 때 여전히 죽습니다. 명백한 이유 없이

TestGenerator: 일치하지 않는 데이터 오류(2016.12.02 12:45에서 볼륨 제한 262 초과)

TestGenerator: 일치하지 않는 데이터 오류(2016.10.13 10:05의 높은 값 1.10131은 최소 시간 프레임에서 도달하지 않음, 높은 가격 1.10123 불일치)

 
trader781 :

덕분에 오류가 사라졌습니다. 그러나 봇은 터미널과 함께 실행될 때 여전히 죽습니다. 명백한 이유 없이

TestGenerator: 일치하지 않는 데이터 오류(2016.12.02 12:45에서 볼륨 제한 262 초과)

TestGenerator: 일치하지 않는 데이터 오류(2016.10.13 10:05의 높은 값 1.10131은 최소 시간 프레임에서 도달하지 않음, 높은 가격 1.10123 불일치)

이것은 봇이 "죽는" 것이 아니라 이야기입니다. 최소한 사전으로 영어를 배우십시오.
 
Vitalie Postolache :
이것은 봇이 "죽는" 것이 아니라 이야기입니다. 최소한 사전으로 영어를 배우십시오.

그리고 한 번에 전체 증기에 똥 같은 이야기? 우연의 일치?

 
trader781 :

그리고 한 번에 전체 증기에 똥 같은 이야기? 우연의 일치?

그래서 무엇? 항상 그랬습니다.