Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 119

 
trader781 :

OK, entendi

Eu entendo que, no momento, tudo isso está longe de ser uma forma aceitável, mas pode ser mostrado por que, no caso de uma compra, não consigo obter uma determinada linha pontilhada da cor especificada, embora ela forneça calmamente o branco ou apenas verde.

Nós vamos

OP duplo = 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

Eu não entendo, pois quando dividir 5 por 100 será 0,5

Eu postei o código corrigido para você, como deveria ser

//+------------------------------------------------------------------+
//|                                                     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:

Certo, entendi.

Entendo que tudo isso está longe de ser aceitável no momento, mas você pode me mostrar porque não consigo obter uma determinadalinha tracejada de uma cor especificada no caso de uma compra, embora branca ou verde simples ela seja facilmente cedida.

e

duplo OP = 5.00000

TP = (OP/100);

Imprimir("TP= ",TP);

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

não entendo desde quando você divide 5 por 100 é 0,5

Não sei por que você não pode dividir bem, tudo funciona para mim

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

  double TP = OP/100;

  Print("TP= ",TP);
  }

Resultado

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:

Eu não sei por que você não pode dividir corretamente, tudo isso é divisível para mim

Eu entendo o princípio, ele cortará o código atual pela metade se funcionar. Quanto ao anterior, ele não começou. Morreu simplesmente junto com o terminal, sendo sobregravado com uma folha vazia.
 

Olá.

Ajude-me com uma pergunta.

Estou modificando uma ordem pendente, alterando o preço de abertura. Solicitar um novo preço aberto após uma mudança bem sucedida. A resposta dá a o antigo e anterior preço . Em qual é o problema ?

Código:

modify=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue);

if(modificar===verdadeiro)

{

Imprimir("BUYSTOP order modify OrderOpenPrice() : ",OrderOpenPrice()));

}

E log entry :

modificar #1 comprar parada 1,00 GBPUSD a 1,60150 sl: 1,59590 tp: 1,63464 ok

BUYSTOP Order Modificar OrderOpenPrice() : 1.6028

modificar #1 comprar parada 1.00 GBPUSD a 1.60070 sl: 1.59590 tp: 1.63464 ok

BUYSTOP OrderOpenPrice() : 1.6015

 
Роман:

Olá.

Ajude-me com uma pergunta.

Estou modificando uma ordem pendente, alterando o preço de abertura. Solicitar um novo preço aberto após uma mudança bem sucedida. A resposta dá a o antigo e anterior preço . Em qual é o problema ?

Código:

modify=OrderModify(OrderTicket(),new_Pr+50*Point,OrderStopLoss(),OrderTakeProfit(),0,Blue);

if(modificar===verdadeiro)

{

Imprimir("BUYSTOP order modify OrderOpenPrice() : ",OrderOpenPrice()));

}

E log entry :

modificar #1 comprar parada 1,00 GBPUSD a 1,60150 sl: 1,59590 tp: 1,63464 ok

BUYSTOP Order Modificar OrderOpenPrice() : 1.6028

modificar #1 comprar parada 1.00 GBPUSD a 1.60070 sl: 1.59590 tp: 1.63464 ok

BUYSTOP OrderOpenPrice() : 1.6015

OrderOpenPrice() armazena o preço que estava lá quando OrderSelect() foi aplicado. O valor em si não mudará, de forma alguma. Você tem que chamar OrderSelect() novamente após modificar o pedido.
 
Vitalie Postolache:
OrderOpenPrice() armazena o preço que estava lá quando OrderSelect() foi aplicado. O valor não mudará por si só, de forma alguma. Devemos chamar OrderSelect() novamente após modificarmos o pedido.
Obrigado. Vou tentar fazer isso.
 

Por favor, ajude!

O objetivo é cortar os zeros (outros números) da matriz, mantendo a seqüência de números na matriz.

Fez este código, mas a matriz é sobrescrita - algo está errado - por favor, informe o que está errado.

//+------------------------------------------------------------------+
//|                                             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-:

Por favor, ajude!

O objetivo é cortar os zeros (outros números) da matriz, mantendo a seqüência de números na matriz

Fez este código, mas a matriz está sobre-escrita - algo está errado - por favor, informe o que está errado.

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

Eu faria o seguinte:

   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-:

Por favor, ajude!

O objetivo é cortar os zeros (outros números) da matriz, mantendo a seqüência de números na matriz

Fez este código, mas a matriz é sobrescrita - algo está errado - por favor, informe o que está errado.

Num relance, eu o teria feito de uma maneira diferente.

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

Sim, há também uma questão de correção na comparação de números reais com 0 por este método.

 

Estou pensando em uma tarefa como esta, não a testei na vida real, devo ou não fazê-lo. Ou indicar outras opções.

Suponha que eu tenha um sinal - em caso de alargamento acentuado (nas notícias)

fechar todas as negociações atuais

Mas as ordens não serão dadas para apenas fechar ou abrir durante as notícias

Portanto, se tomarmos um comando, digamos, OrderClose, colocá-lo em um loop e executá-lo até que feche (de forma semelhante ao OrderSend) e outros comandos que possam terminar sem sucesso

Razão: