[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 277

 
evillive:

Boa tarde!

Por favor, me aconselhe sobre uma maneira confiável de identificar um apartamento, se houver algum.

Há. Esta semana estou cobrando de verdade também com base nisso.
 
evillive:

Boa tarde!
Por favor, me aconselhe sobre uma maneira confiável de identificar um apartamento, se houver algum.

Um apartamento é um movimento de preços que consiste em um ou mais elementos planos.
Um elemento plano é um elemento do movimento de preço formado quando o preço se move em qualquer direção a partir de seu ponto de partida com posterior recuo do preço até este ponto.

 

Para a entrega do pedido é utilizado o seguinte comando

tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );

O comando OrderSend comanda o robô a colocar a ordem; o par de moedas é escrito entre parênteses na primeira posição. Aqui temos o Symbol() que nos dá o par de moedas onde o Expert Advisor é colocado. A isto se segue o nome da operação comercial. Depois temos o volume do lote e temos aqui um multiplicador variável. Preço, depois uma tolerância, não me lembro, 3 pips, Stop Loss, Take Profit, um nome, número mágico - qualquer número que você tenha escolhido, depois eu não me lembro, depois cor. Tudo está nesta ordem. Você pode fazer sem tikett=, apenas OrderSend.

E aqui, preste atenção! O pedido será feito a cada tique, até centenas de pedidos, se for apenas escrito no início. Precisamos de condições para que o pedido seja feito quando for necessário. Exemplo.

for ( i=OrdersTotal();i>0;i--){ OrderSelect(i-1,SELECT_BY_POS );//Alert ("OrderType( )", OrderType( ));
 if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
if(OrderType( ) ==OP_SELLSTOP) { Y++;}
if(OrderType( ) ==OP_SELL) { Y++;}}}
Y=Y-dolivka1;//Alert ("Y++", Y," dolivka1 ",dolivka1);
 if (Y<=0){ // Alert ("Y", Y );
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
   // Alert ("OP_SELLSTOP", GetLastError( )); 
    Error=GetLastError( ); } J=0;

   if (Error !=0 ) { Print ( " Error OP_SELLSTOP " , Error , "tikett",tikett," volume*A ",volume*A," Price -otstup*Point ",Price -otstup*Point," Price-takeprofit*Point-otstup*Point ",Price-takeprofit*Point-otstup*Point, 
  " Ask ", Ask , " Bid " , Bid );
   Error=0;}

Cansado. Use a ajuda, para analisar os exemplos prontos.

 
drknn:


Você já o viu aqui? https://book.mql4.com/ru/samples/index

Geralmente, como qualquer outro programa, o seu consistirá de blocos separados, cada bloco executa uma tarefa. Pegamos um desses blocos e escrevemos nosso próprio código, depuramo-lo de ponta a ponta e depois passamos para o próximo bloco. E assim por diante até o final do programa.


Bem, vou tentar ser mais específico... Meu consultor especializado abre com sucesso UM pedido pendente e tem que modificá-lo após algum tempo... Para isso, preciso saber seu índice ou um número de posição em uma ordem pendente. Como posso obter este número de posição ou seu índice? Temos que procurar por pedidos usando um loop? Eu tenho UM pedido... Aqui está uma parte do código do meu programa que não funciona


se (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==verdadeiro)

{ticket = OrderTicket();

retorno();}

Como devo escrevê-lo corretamente?

 
AlexLaptist:


E ainda assim tentarei colocar a questão com mais precisão... Meu consultor especializado abre com sucesso UM pedido pendente e após algum tempo ele tem que modificá-lo... Para fazer isso, precisamos saber seu índice ou um número de posição em ordens pendentes. Como posso obter este número de posição ou seu índice? Temos que procurar por pedidos usando um loop? Eu tenho UM pedido... Aqui está uma parte do código do meu programa que não funciona


if (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==verdadeiro)

{ticket = OrderTicket();

retorno();}

Como escrevê-lo corretamente?


A função OrderSend( ), se executada com sucesso, retorna o número do ticket da ordem que acabou de abrir - este é seu número seqüencial no servidor, e não há outra ordem desse tipo. Portanto, não há necessidade de fazer um retracement do pedido, basta lembrar seu bilhete. Basta lembrar assim que o pedido for aberto.

int Ticket=OrderSend();
if(Ticket<0){
// тут принтуем сообщение об ошибке.
}
// Вам нужно всё равно создать счётчик ордеров, который обнулит переменную Ticket в том случае, если ордера в рынке больше нет.
 
drknn:


A função OrderSend(), se executada com sucesso, devolve o número do ticket de pedido que acabou de abrir - este é seu número de série no servidor e não há outra ordem desse tipo. Portanto, não há necessidade de fazer um retracement do pedido, basta lembrar seu bilhete. Basta lembrar assim que o pedido for aberto.

E por quanto tempo vamos "lembrá-lo"? Você pode perdê-lo...

IMHO - devemos sempre levar informações frescas e atualizadas conforme a necessidade, não armazená-las na memória, dependendo da ocasião.

Seria melhor encontrar a ordem bem antes de modificá-la do que esperar pela chance. Para o caso de a energia não ser desligada, por exemplo...

 
AlexLaptist:


E ainda assim tentarei colocar a questão com mais precisão... Meu consultor especializado abre com sucesso UM pedido pendente e após algum tempo ele tem que modificá-lo... Para fazer isso, precisamos saber seu índice ou um número de posição em ordens pendentes. Como posso obter este número de posição ou seu índice? Temos que procurar por pedidos usando um loop for? Eu tenho UM pedido... Aqui está uma parte do código do meu programa que não funciona


if (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==verdadeiro)

{ticket = OrderTicket();

retorno();}

Como escrevê-lo corretamente?

Talvez seja algo parecido com isto:

//+----------------------------------------------------------------------------+
int TicketLastSetOrder(string sy, int mn) { // 
   datetime t;
   int      i, op, ticket=-1;
   for (i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         op=OrderType();
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (op<2 || op>5)             continue;
         if (OrderOpenTime()>t)  {
            t=OrderOpenTime();
            ticket=OrderTicket();
            }
         }
      else Print("FUNC TicketLastSetOrder(): Error select order: "+GetLastError());
      }
   return(ticket);
}
//+----------------------------------------------------------------------------+

Devolve o bilhete do último pedido ou -1

Ao ligar, por favor especifique o símbolo requerido e o magik da EA, por exemplo:

   int TicketMyOrder=TicketLastSetOrder(Symbol(), Magic);

Esta função devolverá o bilhete do último pedido pendente colocado no símbolo atual (o único em seu caso). Magia - o número mágico do seu EA

 

Você poderia colocar o bilhete em variáveis globais também. :) Você pode sair de tudo isso. Mas como uma idéia, a seleção do pedido antes da modificação funcionará. Somente se não for necessário reiniciar os lotes apenas 1 vez durante toda a vida útil do pedido (com uma única modificação) :) :) :)

Em resumo, há muitas variantes :)

 

Por favor, me dê uma dica. Eu ainda não descobri como funcionam os indicadores. Meu indicador não saca quando mudo de prazo, e saca de vez em quando. Mas às vezes funciona, e funciona exatamente como eu queria! Por favor, diga-me o que precisa.

//+------------------------------------------------------------------+
//|                                            ИндюкДимонакомпил.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#import "user32.dll"
   int   PostMessageA(int  hWnd,int  Msg,int  wParam,string lParam);
#import
#define WM_COMMAND                     0x0111
int delimiter = 0;

#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 DarkBlue
double ВерхняячертаBuffer1[];
double НижняячертаBuffer2[];
double СинняячертаBuffer3[];
 double вершина; 
 double основание_первого_снижения;
 double начало;
 double вершина_волны_3;
 extern int T=4,K=200;
 int timeframe, start ;
 int бар_вершина ;
 int бар_основание_первого_снижения;
 int бар_начало;
int pereklutsatel;
double naklon,linija2; int P;extern int RO=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(0,ВерхняячертаBuffer1);//Alert ("SetIndexBuffer ",GetLastError( ) );
   SetIndexEmptyValue(0,0.0);
   
   SetIndexStyle(1,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(1,НижняячертаBuffer2);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(1,0.0);
   
   SetIndexStyle(2,DRAW_SECTION,STYLE_SOLID,T,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(2,СинняячертаBuffer3);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(2,0.0);
   
   
  ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
   ObjectsDeleteAll(WindowOnDropped( ) , OBJ_TEXT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;

   for (int i=limit;i>=0;i--) {
//----
 for ( int J=0;J<=RO;J++){
//----

  // for(int i=Bars; i>=0;i--)
   i=Bars;
      бар_вершина=iHighest( NULL,  timeframe, MODE_HIGH, K, start ) ;
       вершина =High[ бар_вершина ];
       бар_основание_первого_снижения=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble ( бар_вершина/2,0), start ) ;
       основание_первого_снижения=Low[ бар_основание_первого_снижения ];
       бар_начало=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble (бар_вершина*1.5,0), бар_вершина ) ;
       начало=Low[ бар_начало ];
       
   ObjectCreate( "вершина",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_вершина],  вершина+(10*Point)) ; 
    ObjectSetText( "вершина", "вершина", 5, "вершина",Crimson ) ;// Alert("GetLastError()",GetLastError());
      // ObjectSet(  "вершина",  OBJPROP_COLOR, Crimson) ;
      
   ObjectCreate( "основание_первого_снижения",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_основание_первого_снижения],  основание_первого_снижения-(10*Point)) ; 
    ObjectSetText( "основание_первого_снижения", "основание_первого_снижения", 5, "основание_первого_снижения",Crimson ) ;   
   
    ObjectCreate( "начало",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_начало],  начало-(10*Point)) ; 
    ObjectSetText( "начало", "начало", 5, "начало",Crimson ) ;   
           
  if(начало>основание_первого_снижения){naklon=(начало-основание_первого_снижения)/(бар_начало-бар_основание_первого_снижения);
 // Alert("naklon  ", naklon);
    НижняячертаBuffer2[бар_начало]=начало;linija2=начало;for(i=бар_начало-1;i>=0;i--){linija2=linija2-naklon;
   
    НижняячертаBuffer2[i]=linija2;  // Alert ("linija2  " , linija2 ); 
     Alert("НижняячертаBuffer2[i]  ", НижняячертаBuffer2[i] , "  i " , i);
     
   }
    НижняячертаBuffer2[бар_основание_первого_снижения]=основание_первого_снижения;}
    
    
         for (i=0;i<100;i++){  СинняячертаBuffer3[i]= Open[i];}
          for (i=330;i<500;i++){  СинняячертаBuffer3[i]= Open[i];}

     ВерхняячертаBuffer1[бар_начало]=начало;
     
 double точка4; int бар_точка4;   бар_точка4=iHighest( NULL,  timeframe, MODE_HIGH, бар_основание_первого_снижения, 3 ) ; 
  точка4 =High[ бар_точка4 ];  
   
   if(вершина>точка4){naklon=(начало-точка4)/(бар_начало-бар_точка4);
   ObjectCreate( "точка4",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_точка4],  точка4+(10*Point)) ; 
    ObjectSetText( "точка4", "точка4", 5, "точка4",Crimson ) ;  
   double linija1=начало;for(i=бар_начало-1;i>=0;i--){linija1=linija1-naklon;ВерхняячертаBuffer1[i]=linija1; }}
   
double vulf=НижняячертаBuffer2[0];
  if ( vulf==Ask||vulf==Bid){vulf=1;}
 if (vulf+(10*Point)>Ask&&vulf-(10*Point)<Bid){vulf=1 ;} 
           
      Alert ("vulf  " , vulf );   Comment ("  vulf!!! "  , vulf);  
   if (vulf==1){Comment ("  Есть вульв!!! "  , "  timeframe " , timeframe);
   ObjectCreate( "пятая_точка!",  OBJ_TEXT , WindowOnDropped( ) , Time[0],  Bid-(10*Point)) ; 
    ObjectSetText( "пятая_точка!", "пятая_точка!", 5, "пятая_точка!",Crimson ) ;   return(0);  }
    if (vulf!=1) {    
   
     if(delimiter<3){delimiter++;Comment(delimiter);return(0);}
   delimiter=0;
    fChangePeriod();P++;
                                 
                   }  } }
//----
   return(0);
  }
//+------------------------------------------------------------------+

void fChangePeriod(){int ii,hwd = WindowHandle(Symbol(),Period());
   switch(Period()){
      case PERIOD_W1    : ii = 33134; break; //PERIOD_D1;
      case PERIOD_D1    : ii = 33136; break; //PERIOD_H4;
      case PERIOD_H4    : ii = 33135; break; //PERIOD_H1;
      case PERIOD_H1    : ii = 33140; break; //PERIOD_M30;
      case PERIOD_M30   : ii = 33139; break; //PERIOD_M15;
      case PERIOD_M15   : ii = 33138; break; //PERIOD_M5;
      case PERIOD_M5    : ii = 33137; break; //PERIOD_M1;
      case PERIOD_M1    : ii = 33141; break; //PERIOD_W1;
   }     
   PostMessageA(hwd, WM_COMMAND, ii, 0);
   return;
}
 
drknn:

Você poderia colocar o bilhete em variáveis globais também. :) Você pode sair de tudo isso. Mas como uma idéia, a seleção do pedido antes da modificação funcionará. Somente se não for necessário reiniciar os lotes apenas 1 vez durante toda a vida útil do pedido (com uma única modificação) :) :) :)

Em resumo, existem muitas variantes :).

Você também pode fazer isso globalmente. Mas o terminal as grava em um arquivo antes de fechar (se a memória me servir corretamente). Ou seja, não poupará da perda de um bilhete em caso de corte inesperado de energia.

Até agora, não vejo uma maneira mais confiável do que obter dados diretamente do servidor quando você precisar deles.