Código de erro "0"? - página 2

 
DomGilberto:
Oh desculpe - eu não estou mais recebendo nenhum erro, o que é que nunca. Estou recebendo apenas ordens de compra em andamento e nenhuma ordem de venda...

É em relação à minha linha anterior com relação aos cross overs de MA - eu ainda não entendi! Mas não quero dar corda a ninguém e bater em um cavalo morto enquanto as pessoas me dão a resposta (embora eu não entenda a resposta rs)! Abraço o RaptorUK por sua ajuda!

Não posso falar por mais ninguém, não vou ser enrolado...

Se você não está recebendo nenhum erro e nenhum pedido de venda feito, então OpenOrdersThisPair(Symbol()) não é igual a 0 , de que tipo é essa função ? é uma int ou uma dupla ? ou talvez uma bool ?

 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//| Check to see if any order open on this currency pair                                                                                   |
//+----------------------------------------------------------------------------------------------------------------------------------------+   

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
} 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

   double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (ticksize == 0.00001 || ticksize == 0.001) // if you set this to 0 it WONT throw an order out straight away.
   pips = ticksize*10;
   else pips = ticksize;  
   

   return(0);
  }
Na verdade, não consigo entender qual é a questão. Eu escrevi o MA se as declarações de tantas maneiras que meu limitado conhecimento me diz (claramente limitado como não funciona no lado curto...)

Eu acho que é porque as ordens não estão simplesmente sendo colocadas no local onde a cruz das médias móveis acontece, mas em um ponto diferente.
 
//+----------------------------------------------------------------------------------------------------------------------------------------+   
//| Function that checks for an MA Cross                                                                                                   |
//+----------------------------------------------------------------------------------------------------------------------------------------+   
  

void CheckForMaTradeLong()
{
   
   TriggerBarTime = Time[1];
   
   for (int i=0; i < Bars; i++)
   {
   double i1  = iMA(NULL,60,3,0,1,0,i); 
   double i2  = iMA(NULL,60,5,0,1,0,i);
   double i3  = iMA(NULL,60,8,0,1,0,i);
   double i4  = iMA(NULL,60,10,0,1,0,i);  
   double i5  = iMA(NULL,60,12,0,1,0,i);
   double i6  = iMA(NULL,60,15,0,1,0,i);  
   double i7  = iMA(NULL,60,30,0,1,0,i);
   double i8  = iMA(NULL,60,35,0,1,0,i);
   double i9  = iMA(NULL,60,40,0,1,0,i);
   double i10 = iMA(NULL,60,45,0,1,0,i);
   double i11 = iMA(NULL,60,50,0,1,0,i);
   double i12 = iMA(NULL,60,60,0,1,0,i); 
   double ema21 = iMA(NULL,60,21,0,1,0,i);   

   double TriggerBarTime = (i1>i2 && i2>i3 && i3>i4 && i4>i5 && i5>i6 && i6>i7 && i7>i8 && i8>i9 && i9>i10 && i10>i11 && i11>i12); // this needs to just tell me where all the MA's fan up and nothing more...
   if(i1 > i12)
   if (TriggerBarTime == true)
       if(Low[1]<ema21 && i12<Close[1]) OrderEntry(0);
         if(Close[1]<i12) DeleteOrder(0);   
   
   break;
   }
   return(i-1);
   }

Eu sei que este é o problema! Sei que já perguntei antes sobre um tópico diferente, mas eu realmente apreciaria a resposta a esta pergunta (e sim, sei que o código é descuidado, apenas passei muito tempo cortando, compilando e executando estratégias para ver em primeira mão como eles estão se comunicando uns com os outros. Sem mencionar a forma desnecessária como o escrevi também... mas ignorando isso...)

P.1) No que diz respeito à linha de "tempo duplo de gatilho" e a > do que a seção.... Tudo o que quero entender é como digo a esta função para descobrir quando todas as médias móveis são maiores do que a média móvel anterior comparada, e depois esquecer de garantir que elas permaneçam na ordem correta... em vez disso, a partir desse ponto tudo o que preciso ter certeza é que o PREÇO FECHADO permaneça acima da "i12" (60 EMA) - se assim for, então pode seguir adiante com as outras declarações IF e lançar uma ordem longa via "OrderEntry(0)" - se não for, então precisa então olhar para a linha longa (i1>i2 && i2>i3...) e esperar que isso seja verdade novamente antes de considerar as próximas linhas...

Eu sei que a resposta está me encarando, só está se tornando um pouco frustrante e realmente apreciaria este nugget.... Obrigado!

 
  1. Seu posto
    double TriggerBarTime = (i1>i2  && i2>i3   && i3>i4 && i4>i5 && 
                             i5>i6  && i6>i7   && i7>i8 && i8>i9 && 
                             i9>i10 && i10>i11 && i11>i12);
       if (TriggerBarTime == true)
    Que tipo de dados deve ser o TrgggerBarTime?
    double  TriggerBarTime = boolean;
       if (double == true)

  2. Por que você está olhando para barras antigas para TriggerBarTime E a última barra para a ordemEntry?
  3. Conserte sua indentação
    Seu posto
       if(i1 > i12)
       if (TriggerBarTime == true)
           if(Low[1]<ema21 && i12<Close[1]) OrderEntry(0);
             if(Close[1]<i12) DeleteOrder(0);   
    Apropriadamente indentados. É isto realmente o que você quis dizer?
    if(i1 > i12 && TriggerBarTime && Low[1]<ema21 && i12<Close[1]){
        OrderEntry(0);
    }
    if(Close[1]<i12){
        DeleteOrder(0);
    }
    
 
//TriggerBarTime works in conjunction with:

   int iTBT= iBarShift(NULL,60, TriggerBarTime, true),
        iHH= iHighest(NULL,60, MODE_HIGH, iTBT + 1, 0); 
            double buyPrice = High[iHH]+PadAmount*pips;

//I then use this "buyPrice" in conjunction with OrderSend for where the price of the entry order is...

Eu quero saber onde todos os MA's estão fantasiados, mas eles NÃO precisam ser verdadeiros TODO o tempo... Eu só quero que isso seja verdade antes de qualquer outra coisa... Com base nisso é verdade, tudo o que precisa acontecer a partir deste preço é que NENHUMA barra feche abaixo dos 60 EMA (por um longo período) para permanecer válida para qualquer posição longa ser empurrada para fora...

Estou usando o TriggerBarTime para encontrar o ponto mais alto de onde todas as médias móveis se empilharam na ordem certa e a barra que então procede ao tocar o 21 EMA...

Portanto, embora você tenha corrigido o traço para mim, isso praticamente faz o que eu tinha escrito antes (a menos que esteja faltando algo...) Prova que eu não o expliquei corretamente.

(ah sim - eu sei que deveria ser bool que foi um erro - eu estava simplesmente brincando e esqueci de trocá-los de volta).

 
double TriggerBarTime = (i1>i2 .. 
é verdadeiro ou falso 0 ou 1 nada mais
 int iTBT= iBarShift(NULL,60, TriggerBarTime, true),
O terceiro argumento para iBarShift deve ser uma data/hora. iBarShift(0) ou (1) SEMPRE será Bars-1.
 
datetime          TriggerBarTime;
Tenho isto na seção global...

Eu não entendo seu post anterior? ^

É possível sugerir como eu escrevo a linha If relativa ao meu posto acima do seu?
 
DomGilberto: Tenho isto na seção global...
E você o escondeu com a declaração local.
 
Desculpe, mas isso novamente não faz sentido para mim...
 
DomGilberto: Desculpe, mas isso novamente não faz sentido para mim...
int myVariable = 0;
int start(){
  double myVariable = 1;
  Print(myVariable); // Outputs 1.0
  myVariable++;
  myFunction(myVariable);
}
void myFunction(double v){
  Print(myVariable," ",v); // Outputs 0 2.0
}