[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 546

 

A EA tem o seguinte bloco (Contador de eventos):

if (isCloseLastPosByStop()==True) // Se a última encomenda fosse fechada por Stop

{
N=N+1;
Alerta(N, " alce ");
} else N=0;

PERGUNTA: como escrever os dados em um arquivo (excel) em vez de exibi-los na tela?

 
Dimka-novitsek:

Boa tarde, você poderia me dizer como pode ser, seleciono uma ordem em um loop, passo por qual ordem é a última e me lembro dela assim ticket = OrderTicket();

Neste caso, digamos que é o número dois. Um pouco mais tarde se (bilhete>-1){
OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY);

e muitas vezes recebo erro 4105 - ordem não selecionada!!!


E isso porque a ordem ainda não foi fechada. Não está em MODE_HISTORY, ainda está em MODE_TRADES.
 

for(  i=0;i<=OrdersHistoryTotal();i++){
    OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY);
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

De jeito nenhum! Por que não? Não havia ordens em aberto no momento da ultrapassagem! Talvez eu não entenda.

O ciclo de busca também está na história! É aí que eu atribuo à variável int ticket!

E jura, com licença, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: Alerta: SELL Select error HISTORYticket 4105

Quando se passa de MODE_HISTORY para MODE_TRADES?

E o mais importante, seleciono a mesma ordem na história com a ajuda da seleção da ordem, e ela é selecionada primeiro, caso contrário eu não seria capaz de trabalhar com ela! Não há lógica !!!!!! Estou chocado...




 
Dimka-novitsek:

De jeito nenhum! Por que não? Não havia ordens em aberto no momento da ultrapassagem! Talvez eu não entenda.

O ciclo de busca também está na história! É aí que eu atribuo à variável int ticket!

E jura, com licença, 2012.02.04 11:28:47 2011.12.06 16:35 GMT EURUSD,M30: Alerta: SELL Select error HISTORYticket 4105

Quando passa de MODE_HISTORY para MODE_TRADES ?


ticket=-1;
for(  i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i ,SELECT_BY_POS,MODE_HISTORY));{
     if (OrderMagicNumber( )== magic) { if(OrderSymbol()== Symbol()) {





 current = OrderOpenTime();  Alert ( " current = OrderOpenTime(); ",  current);Alert ( " max ", max );
      
      if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket();   Alert ( " ticket = OrderTicket();  ", ticket );
      }}}}}


       if (ticket>-1){
      OrderSelect( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;
Acrescentei uma linha no início e corrigi as duas linhas de código seguintes.
 
Obrigado!!!
 

ajudar a inserir um stop loss em um EA

por favor

Arquivos anexados:
my_1.mq4  10 kb
 
Favor compartilhar a função para calcular o lote máximo permitido, levando em conta as posições abertas, ou seja, patrimônio líquido. A função padrão calcula o risco, mas se houver negócios, não há dinheiro suficiente para abri-los
 
T-G:
Favor compartilhar a função para calcular o lote máximo permitido, levando em conta as posições abertas, ou seja, patrimônio líquido. A função padrão calcula o risco, mas se houver negócios, não há dinheiro suficiente para abri-los


No caso mais simples, é assim:

double Klots = 0.1; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots=NormalizeDouble(Klots*AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);Lots=MathMax(MarketInfo(Symbol(),MODE_MINLOT),Lots);
 

Rapazes, vocês podem aconselhar sobre esta questão?

Aqui está um roteiro para encontrar o tamanho máximo da folga em zig-zag do crenfx - veja aqui:

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}

Lanço-o no gráfico do instrumento no M5 - funciona bem com o cronograma padrão

extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';

é a profundidade máxima da história do símbolo no escritório da Alpari ao carregá-lo com F2 - eu o verifiquei, ou seja, parece ser o conteúdo da aba "Experts" do terminal do cliente - parece ser verdade:

Ao usar o mesmo projeto de script em minha EA no mesmo intervalo de tempo no mesmo período de gráfico M5, não conta corretamente, ou seja

calcula números bastante diferentes (menores do que no script) ou 0. Qual pode ser o erro ou pode ser algum tipo de incoerência histórica? Obrigado.

Isto é, eu começo no testador com a coruja após o tempo estimado para encontrar uma coruja à prova de falhas, em teoria tudo é normal e os números do roteiro e da coruja devem ser os mesmos... Qual poderia ser o erro?

 

É assim que eu carrego este roteiro para minha coruja:

extern string A3 = "Расчет безотката";
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100;
extern datetime StartTime = D'2011.03.24';
extern datetime EndTime = D'2011.12.31';
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
  //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
    int ZigZagData[];
    int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
    ArraySort(ZigZagData);
  
    Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");        

  
   
    return (0);
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

Parece ser tudo a mesma coisa - qual poderia ser o erro?