[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 277

 

Sim, de fato. Deu uma olhada, mas não o viu.

Obrigado (risos)

Hoje estou diminuindo meu ritmo. Precisa descansar para o fim de semana.

 
rid >> :

É mais ou menos isso...



Obrigado!!! Eu estarei usando....

 


DDFedor



Rid



Obrigado.

 

Mesmo assim, o código não funcionou, fez toda a ação em 2 velas. e teve que aprender que a posição já tem mais não abre ... porque abriu de todo que eu poderia todo o depósito usado(( Rid look, talvez o que mais você precisa acrescentar ... seria muito grato

 

Ajuda. Quero um EA que negociará à noite. Estou escrevendo código

int start()
{
string Symb;
Symb=Symbol();
string Vremya;
Vremya=TimeToStr(TimeLocal(),TIME_MINUTES);
if(Vremya > 23:00 || Vremya < 06:00 )
{
// тут торговые функции
}
}

Ele gera um erro

||' - a condição não pode ser um fio

E se a condição for encurtada para

if(Vremya > 23:00

funcionará,

E se for para

if(Vremya < 06:00 )

não vai funcionar.


Eu não entendo o que está errado. Você pode me dizer como marcar o horário?


 
morok >> :

Mesmo assim, o código não funcionou, eu fiz todos os ofícios em 2 castiçais.

Sim, de fato....

Esqueci de colocar o magik no arquivo ORDERSEND.

Agora está funcionando bem. Verificado. Não pode haver mais do que dois ofícios dirigidos de maneira diferente ou não pode haver mais do que um ofício unidirecional.

Se não for necessário mais de um negócio de qualquer tipo, é necessário em f-ki NumberOfPositions(c) substituir o tipo de negócio por -1 (menos um)

extern int   Magic = 777;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil", Magic,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil", Magic,0,Violet);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}




 
alderru >> :

Por favor, diga-me o que a função iTime mostra.

O que é essa algaraviada de 10 dígitos? Segundos?

Como traduzi-los em ano-mês-dia-hora-minuto?

>> Assim: basta definir o deslocamento de barras e obter a hora e data padrão (se hora=1 ou verdadeira, você obtém apenas a hora).

Recurso muito útil, eu o recomendo.

string Times(int Sdvig, bool time=0)
{//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  string YAER   = TimeYear( Time[ Sdvig]);
  string DAY    = TimeDay( Time[ Sdvig]);
  string HOUR   = TimeHour( Time[ Sdvig]);
  string MINUTE = TimeMinute( Time[ Sdvig]);
  int month = TimeMonth( Time[ Sdvig]);
  string MONTH;
  switch( month)
    {case 1: MONTH = "янв ";break;
     case 2: MONTH = "фев ";break;
     case 3: MONTH = "март";break;
     case 4: MONTH = "апр ";break;
     case 5: MONTH = "май ";break;
     case 6: MONTH = "июнь";break;
     case 7: MONTH = "июль";break;
     case 8: MONTH = "авг ";break;
     case 9: MONTH = "сен ";break;
     case 10: MONTH = "окт ";break;
     case 11: MONTH = "нояб";break;
     case 12: MONTH = "дек ";break;              
     default: MONTH = "----";break;
    }
 if(TimeHour( Time[ Sdvig])<10) HOUR= "0"+ HOUR;     
 if( MINUTE=="0") MINUTE="00";
 if( time)return( HOUR+":"+ MINUTE);                   
 else return( YAER+"   "+ MONTH+" "+ DAY+"   "+ HOUR+":"+ MINUTE);
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Eu tentei ajustar o segundo nível, mas não funcionou.

Eu tentei fazer isso, mas ele abriria e fecharia uma ordem imediatamente após o teste.

extern int   Magic = 777;
extern int       Ema1=14;
extern int       Ema2=48;
extern int       Ema3=100;
double Ema_1;
double Ema_2;
double Ema_3;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_3 =iMA(NULL, 0, Ema3, 0,MODE_SMMA, PRICE_MEDIAN, 0);     
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2 && Ema_2> Ema_3) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"kupil", Magic,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2 && Ema_2< Ema_3) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,0,"kupil", Magic,0,Violet);
    } 
//--------------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)>= 1 && Ema_1< Ema_2) //--проверяю есть ли ордер BUY и крою его если линии ема пересеклись
    {
      ticket=OrderClose(OrderTicket(),0.1,Bid,300,Violet);
    } 
//------------------------------------------------------
 if ( NumberOfPositions(NULL,OP_SELL, Magic)>= 1 && Ema_1> Ema_2) //--проверяю есть ли ордер SEll и крою его если линии ема пересеклись
    {
      ticket=OrderClose(OrderTicket(),0.1,Ask,300,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}
 
rid писал(а) >>

Entendi. Para determinar se houve posições sobre a história, você pode fazer isso:

Mas então seu código só funcionará no testador. Caso contrário, você teria que mudar o magik toda vez que ligar o EA online.


Exatamente, isso é exatamente o que precisamos!

Por favor, informe como inserir este código corretamente nesta grade:

(Se eu o colocar diretamente, o testador apenas pára na abertura da primeira posição)

for (int i=0; i< OrdersTotal(); i++)                          {

    if (!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ))) continue;

//выбираем из истории счета

    if (OrderSymbol() != Symbol()) continue;    

     if ( OrderMagicNumber()== Magic)                            {

              позиции = true;

                                                             }}



//Открытие позиции:



bool Open_Buy() {

   bool res=false; 

if( условие_1)      {

            if ( советник еще не открывал позиций с Магическим номером)    {

                    res=true;     }}

else    {

    if( условие_1)       { 

   if ( условие_2 опирается на данные прошлого ордера)       { 

   res=true;     }}}

return( res);

}
 
morok >> :

Eu tentei ajustar o segundo nível, mas não funcionou.

Parece ser bastante lógico, mas no teste ele abre e cobre os pedidos de uma só vez

Lidei com posições de fechamento em minha época aqui -

https://www.mql5.com/ru/forum/105913

//==================Закрытие позиций ============================
 
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect( v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()== Magic)      { 
//-----------------------------------------------------                  
if(OrderType()== OP_BUY) { // если открыта бай-позиция                                   
  if( вот здесь вставляй свои условия закрытия)  {
    OrderClose(OrderTicket(),OrderLots(),Bid,3,Вlack); // закрываем позицию
                                 }       
                               }  
 //--------------------------------------------------------
if(OrderType()== OP_SELL) { // если открыта селл-позиция 
 if( вот здесь вставляй свои условия закрытия)    {
   OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow); // закрываем позицию
                     }       
                   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
//------------конец блока закрытия позиций-----------------

Este bloco deve ser inserido dentro da função START, talvez logo no início, logo após o cálculo de Ema_1,Ema_2,Ema_3.
E, aparentemente, é necessário fazer com que o assessor trabalhe por PREÇOS ABERTOS, caso contrário, a travessia MA fechará constantemente as posições abertas em quase todos os tick.

E da maneira como você fez - não funcionaria corretamente on-line, porque a EA fechará todas as posições, mesmo aquelas abertas por outra EA ou manuais.

Mas já escrevi como simplificá-lo ainda mais. Em vez de NumberOfPositions(NULL,OP_BUY,Magic) e em vez de NumberOfPositions(NULL,OP_SELL,Magic) ao abrir posições, basta definir

NúmeroOdePosições(NULL,-1,Magia)

e então não haverá mais do que uma posição no mercado o tempo todo. Sem nenhum bloco de fechamento.