新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 119

 
trader781 :

好,我知道了

我知道目前这一切都远非可接受的形式,但可以说明为什么在购买的情况下,我无法获得指定颜色的给定点划线,尽管它会平静地发出白色或者只是绿色。

双 OP = 5.00000

TP = (OP/100);

打印("TP= ",TP);

2017.02.09 21:36:03.650 2015.01.05 04:00:00 马丁 H1-1 USDJPY,H1: TP= 0.5

我不明白,因为 5 除以 100 将是 0.5

我为您发布了更正的代码,因为它应该是

//+------------------------------------------------------------------+
//|                                                     Close_MA.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict

extern bool Uslovie1= false ; //Uslovie 4 6+50 MA

extern bool OpenOrders= false ; //+---Открыть ордер

extern double Lots= 0.01 ; //Oбьем открываемого ордера

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

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

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

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

extern uint X= 1 ;                                           // отклонение от ма, пунктов
extern bool PlaySound = false ;
extern int M= 1000 ;                                         // миллисекунды в Sleep
extern int R;                                               // раз повторения музыки
extern int count= 0 ;
extern int Step= 500 ;                                       // счетчик тиков 500макс.
int    i;                                                   // исходный счетчик ордеров
int    p= 0 ;                                                 // внутренняя для playSound
bool   y = false ;                                           // для удобства сравнений условий 1,2,3,4,5,6  
bool   dummy;                                               // для выхода функций в переменную
int    ticket = 0 ;                                           // тикет открываемого ордера
int Magic= 222 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+



int OnInit ()
  {
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
     {
       if ( Bars < 801 || ( IsTradeAllowed ()== false )) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         return ;
     }
//+----------------------------------------------------------------

   double ma1= NormalizeDouble ( iMA ( NULL , 0 ,Period1, 0 , MODE_SMA ,PRICE1, 0 ), 5 );

   double ma2= NormalizeDouble ( iMA ( NULL , 0 ,Period2, 0 , MODE_SMA ,PRICE1, 0 ), 5 );   //три заданных параметра ма

   double ma3= NormalizeDouble ( iMA ( NULL , 0 ,Period3, 0 , MODE_SMA ,PRICE1, 0 ), 5 );
//+-----------------------------------------------------------------  Открытие ордеров

//+----Купить

     {
       if ( MathAbs ( Bid -ma3)< 1000 * Point () && (myOrdersTotal()== false ))
        {
         ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray ); //+------отправка 1 ордера
         HLineCreate( 0 , "buy" , 0 ,FindLastOrderOpenPrice(), clrAzure , STYLE_DASHDOT , 3 );
        }
       else if (( Ask >=(FindLastOrderOpenPrice()+(Step* _Point ))) && myOrdersTotal()) //+------------если ордер в плюс
        {
         ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray );
         HLineMove( 0 , "buy" ,FindLastOrderOpenPrice());
        }
       else if (( Ask <=(FindLastOrderOpenPrice()-(Step* _Point ))) && myOrdersTotal()) //+------------если ордер вплюс
        {
         ticket= OrderSend ( Symbol (), OP_BUY ,Lots, Ask , 50 , 0 , 0 , "" ,Magic, 0 , clrLightGray );
         HLineMove( 0 , "buy" ,FindLastOrderOpenPrice());
        }
       else if (ticket== 0 )
        {
         return ;
        }

/*          
                               //+----Продать

         if(MathAbs(Bid-ma3)>1000*Point() && (myOrdersTotal()==false))
           {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);//+------отправка 1 ордера
            HLineCreate1();  
           }
         else if ((Ask>=(FindLastOrderOpenPrice()+(Step*_Point)))&& myOrdersTotal())//+------------если ордер в минус
              {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);
            HLineMove1();
              }
         else if ((Ask<=(FindLastOrderOpenPrice()-(Step*_Point)))&& myOrdersTotal())//+------------если ордер вплюс
              {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,50,0,0,"",Magic,0,clrLightGray);
            HLineMove1();
              }
         else if(ticket==0)
           {
            return;
           }       */

     }

//+------------------------------------------------------------------Условия
   if (Uslovie1== true ) //Bid+ma800
     {
       if (( Bid >=ma3-X* Point && Bid <ma3) || ( Bid <=ma3+X* Point && Bid >ma3))
        {
           {y= true ;}
        }
     }
//+------------------------------------------------------------------закрыть покупки или продажи

   if ((y== true ) && (myOrdersTotal()== true )) //продажа
     {
      dummy=( OrderClose ( OrderTicket (), OrderLots (), Ask , 0 ,White));
     }
   if ((y== true ) && (myOrdersTotal()== false ))
     {
      dummy= false ;
      HLineDelete( 0 , "buy" );
       //  ExpertRemove();  
     }

  }
//+------------------------------------------------------------------+
bool myOrdersTotal() //если ордера есть
  {
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--) //   цикл будет работать пока не останется ордеров
     {
       if ((( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))== true ) && OrderSymbol ()== Symbol () && ( OrderType ()< 2 ))
        {
         return true ;
        }
     }
   return false ;
  }
//-------------------------------------------------------------------
double FindLastOrderOpenPrice()
  {
   double oldorderopenprice= 0 ;
   int     oldticket= 0 ;
   ticket= 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;
            oldorderopenprice= OrderOpenPrice ();
           }
        }
     }
   return (oldorderopenprice);
  }
//-------------------------------------------------------------------  

//+------------------------------------------------------------------+
//| Создает горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineCreate( const long             chart_ID= 0 ,         // ID графика
                 const string           name= "HLine" ,       // имя линии
                 const int              sub_window= 0 ,       // номер подокна
                 double                 price= 0 ,           // цена линии
                 const color            clr= clrRed ,         // цвет линии
                 const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии
                 const int              width= 1 ,           // толщина линии
                 const bool             back= false ,         // на заднем плане
                 const bool             selection= true ,     // выделить для перемещений
                 const bool             hidden= true ,       // скрыт в списке объектов
                 const long             z_order= 0 )         // приоритет на нажатие мышью
  {
//--- если цена не задана, то установим ее на уровне текущей цены Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
   ResetLastError ();
//--- создадим горизонтальную линию
   if ( ObjectFind (chart_ID,name)!=sub_window)
     {
       if (! ObjectCreate (chart_ID,name, OBJ_HLINE ,sub_window, 0 ,price))
        {
         Print ( __FUNCTION__ ,
               ": не удалось создать горизонтальную линию! Код ошибки = " , GetLastError ());
         return ( false );
        }
     }
//--- установим цвет линии
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль отображения линии
   ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину линии
   ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии                                 |
//+------------------------------------------------------------------+
bool HLineMove( const long    chart_ID= 0 ,   // ID графика
               const string name= "HLine" , // имя линии
               double        price= 0 )       // цена линии
  {
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
   ResetLastError ();
//--- переместим горизонтальную линию
   if ( ObjectFind (chart_ID,name)==- 1 ) return ( false );
   if (! ObjectMove (chart_ID,name, 0 , 0 ,price))
     {
       Print ( __FUNCTION__ ,
             ": не удалось переместить горизонтальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineDelete( const long    chart_ID= 0 ,   // ID графика
                 const string name= "HLine" ) // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError ();
//--- удалим горизонтальную линию
   if ( ObjectFind (chart_ID,name)==- 1 ) return ( false );
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": не удалось удалить горизонтальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+


...

 
trader781:

好吧,我明白了。

我明白目前这一切都远不能接受,但你能告诉我为什么在购买的情况下,我不能得到一个指定颜色的虚线,虽然白色或纯绿色会很容易给出来。

双重OP=5.00000

TP=(OP/100)。

Print("TP=",TP)。

2017.02.09 21:36:03.650 2015.01.05 04:00:00 martin H1-1 USDJPY,H1: TP= 0.5

我不明白,你什么时候用5除以100是0.5

我不知道为什么你不能正确地划分它,它对我来说都是有效的。

void OnStart()
  {
//---
   double OP = 5.00000;

  double TP = OP/100;

  Print("TP= ",TP);
  }

结果

2017.02.10 06:22:48.633 Script test USDCHF,H1: loaded successfully
2017.02.10 06:22:48.663 test USDCHF,H1: initialized
2017.02.10 06:22:48.663 test USDCHF,H1: TP= 0.05
2017.02.10 06:22:48.663 test USDCHF,H1: uninit reason 0
2017.02.10 06:22:48.663 Script test USDCHF,H1: removed


...

 
Sergey Gritsay:

我不知道为什么你不能正确地划分它,对我来说都是可以划分的。

我理解这个原理,如果成功的话,它将把目前的代码减少一半左右。至于之前的那辆,没有启动。它只是与终端一起死亡,被一张空表所覆盖。
 

你好。

帮我解决一个问题。

我正在修改一个挂单,改变开盘价。更改成功后要求新的公开价格。 响应 给予 旧的 以前的 价格 ,什么是 的问题

代码。

修改=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue)。

如果(modify==true)

{

Print("BUYSTOP订单修改OrderOpenPrice():",OrderOpenPrice())。

}

日志条目

修改 #1 买入止损 1.00 GBPUSD at1.60150 sl: 1.59590 tp: 1.63464 ok

BUYSTOP订单修改OrderOpenPrice() 1.6028

修改 #1 买入止损 1.00 GBPUSD at1.60070 sl: 1.59590 tp: 1.63464 ok

BUYSTOP订单修改OrderOpenPrice() 1.6015

 
Роман:

你好。

帮我解决一个问题。

我正在修改一个挂单,改变开盘价。更改成功后要求新的公开价格。 响应 给予 旧的 以前的 价格 ,什么是 的问题

代码。

修改=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue)。

如果(modify==true)

{

Print("BUYSTOP订单修改OrderOpenPrice():",OrderOpenPrice())。

}

日志条目

修改 #1 买入止损 1.00 GBPUSD at1.60150 sl: 1.59590 tp: 1.63464 ok

BUYSTOP订单修改OrderOpenPrice() 1.6028

修改 #1 买入止损 1.00 GBPUSD at1.60070 sl: 1.59590 tp: 1.63464 ok

BUYSTOP订单修改OrderOpenPrice() 1.6015

OrderOpenPrice()存储的是应用OrderSelect()时的价格。价值本身不会改变,没有办法。你必须在修改订单后再次调用OrderSelect()。
 
Vitalie Postolache:
OrderOpenPrice()存储的是应用OrderSelect()时的价格。价值不会自己改变,不可能。我们应该在修改完订单后再次调用OrderSelect()。
谢谢你。我将努力去做。
 

请帮助我们!

目标是将零(其他数字)从数组中删除,同时保持数组中的数字顺序

做了这段代码,但数组被覆盖了--有些地方不对--请告诉我哪里不对。

//+------------------------------------------------------------------+
//|                                             Test_MassivObrez.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int massivSize=19; //размер массива  
   double summDelta[19]=
     {
      0,
      20,
      30,
      0,
      0,
      51,
      0,
      53,
      54,
      60,
      70,
      80,
      120,
      150,
      0,
      210,
      223,
      232,
      250,
      0
     };


      int SizeMass=ArraySize(summDelta);//Узнаем размер массива
      int CalcZrero=0;
      for(int i=0;i<SizeMass;i++)
      {
       Print ("Число на проверку=",summDelta[i], " цикл ",i);
       if (summDelta[i]!=0)
       {
         Print ("Число до исключения нуля=",summDelta[i], " цикл ",i);
         for(int i=0;i<SizeMass;i++) printf("Состав массива до исключения нуля summDelta[%d] = %G",i,summDelta[i]);  
         ArrayCopy(summDelta,summDelta,i-CalcZrero,i);
         Print ("Число после исключения нуля=",summDelta[i-CalcZrero], " цикл ",i);
         for(int i=0;i<SizeMass;i++) printf("Состав массива после исключения нуля summDelta[%d] = %G",i,summDelta[i]);  
       }
       else CalcZrero++;      
      }

     for(int i=0;i<SizeMass;i++) printf("Массив после исключения нуля summDelta[%d] = %G",i,summDelta[i]);            
     ArrayResize(summDelta,SizeMass-CalcZrero,0);
     SizeMass=ArraySize(summDelta);//Узнаем новый размер массива
     for(int i=0;i<SizeMass;i++) printf("Массив после исключения нуля и обрезания summDelta[%d] = %G",i,summDelta[i]);            
  }
//+------------------------------------------------------------------+
 
-Aleks-:

请帮助我们!

目的是在保持数组中的数字顺序的情况下,从数组中删除零(其他数字)。

做了这段代码,但数组被覆盖了--有些地方不对--请告知哪里不对。

//+------------------------------------------------------------------+
//|                                             Test_MassivObrez.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

我将做以下工作。

   int n=-1;
   double ResummDelta[]; // создадим новый массив
   double summDelta[]=
     {
      0,
      20,
      30,
      0,
      0,
      51,
      0,
      53,
      54,
      60,
      70,
      80,
      120,
      150,
      0,
      210,
      223,
      232,
      250,
      0
     };
    
    for(int i=0;i<ArraySize(summDelta);i++) {    
     if(summDelta[i]!=0) {
      n++;
      ArrayResize(ResummDelta,n+1);
      ResummDelta[n]=summDelta[i];
     }  
    }
   // Print( ArraySize(summDelta)," = ",ArraySize(ResummDelta) );//Узнаем новый размер массива  
 
-Aleks-:

请帮助我们!

目标是将零(其他数字)从数组中删除,同时保持数组中的数字顺序

做了这段代码,但数组被覆盖了--有些地方不对--请告诉我哪里不对。

一眼望去,我就会用不同的方式来做。

double a[ 20 ] = { /*массив значений*/ };
double b[ 20 ];
//--- Проверяем массив а на наличие 0 значений
int j = 0;
for( int i = 0; i < 20; i++ )
   {
    if( a[ i ] != 0 )
      {
       b[ j ] = a[ i ];
       j++;
      }  
   }
//--- Изменяем размер массива а на значение j
//--- Копируем массив b в массив a

是的,用这种方法将实数与0相比较,也有一个正确性问题。

 

我正在考虑这样一个任务,我还没有在现实生活中测试过,我到底该不该做。或指出其他选项。

假设我有一个信号--在价差急剧扩大的情况下(在新闻上)。

关闭所有当前交易

但在新闻发布期间,不会只下达收盘或开盘的命令。

因此,如果我们把一个命令,例如OrderClose,放入一个循环中,并执行它,直到它关闭(类似于OrderSend),以及其他可能终止不成功的命令

原因: