Код ошибки "0"? - страница 2

 
DomGilberto:
О, простите - я больше не получаю никаких ошибок. Я получаю только проходящие ордера на покупку и никаких ордеров на продажу...

Это связано с моей предыдущей темой о пересечении МА - я все еще не понимаю! Но я не хочу никого заводить и бить мертвую лошадь, в то время как люди дают мне ответ (хотя я не понимаю ответа lol)! Спасибо RaptorUK за вашу помощь!

Не могу говорить за других, я не заводился....

Если вы не получаете ошибок и ордер на продажу не установлен, значит OpenOrdersThisPair(Symbol()) не равен 0, какой тип у этой функции? int или double? или может 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);
  }
На самом деле я не могу понять, в чем проблема. Я написал MA if statements так много способов, как подсказывают мне мои ограниченные знания (явно ограниченные, поскольку это не работает на короткой стороне...)

Я думаю, что это потому, что ордера не просто размещаются в месте пересечения скользящих средних, а в другой точке.
 
//+----------------------------------------------------------------------------------------------------------------------------------------+   
//| 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);
   }

Я знаю, что проблема в этом! Я знаю, что уже спрашивал об этом в другой теме, но я был бы очень признателен за ответ на этот вопрос (и да, я знаю, что код неряшливый, я просто потратил много времени на нарезку, компиляцию и запуск стратегии, чтобы увидеть из первых рук, как они взаимодействуют друг с другом. Не говоря уже о том, что я тоже написал его неаккуратно... но не будем обращать на это внимания...)

Q.1) Что касается строки "double triggerbartime" и > than section..... Все, что я хочу понять, это как я скажу этой функции найти, когда все скользящие средние больше, чем предыдущая сравненная скользящая средняя, а затем забыть о том, чтобы убедиться, что они остаются в правильном порядке... Вместо этого мне нужно убедиться, что PRICE CLOSE остается выше "i12" (60 EMA) - если это так, то она может следовать дальше с другими операторами IF и выставлять длинный ордер через "OrderEntry(0)" - если нет, то она должна посмотреть на длинную линию (i1>i2 && i2>i3...) и ждать, пока она снова станет истинной, прежде чем рассматривать следующие линии...

Я знаю, что ответ смотрит прямо на меня, просто я немного расстраиваюсь и был бы очень признателен за этот маленький самородок..... Спасибо!

 
  1. Ваш пост
    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)
    Какой тип данных должен быть у TrgggerBarTime?
    double  TriggerBarTime = boolean;
       if (double == true)

  2. Почему вы смотрите на старые бары для TriggerBarTime и последний бар для OrderEntry?
  3. Исправьте отступы
    Ваш пост
       if(i1 > i12)
       if (TriggerBarTime == true)
           if(Low[1]<ema21 && i12<Close[1]) OrderEntry(0);
             if(Close[1]<i12) DeleteOrder(0);   
    Правильный отступ. Это действительно то, что вы имели в виду?
    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...

Я хочу знать, где все МА расположены веером, но они НЕ ДОЛЖНЫ быть истинными ВСЕГДА... Я просто хочу, чтобы это было правдой прежде, чем что-либо еще... Исходя из этого, все, что должно произойти с этой ценой, это чтобы НИ ОДИН бар не закрылся ниже 60 EMA (для лонга), чтобы любая длинная позиция оставалась действительной...

Я использую TriggerBarTime, чтобы найти самую высокую точку, где все скользящие средние складываются в правильном порядке, и бар, который затем продолжает касаться 21 EMA...

Так что, хотя вы выровняли отступы для меня, это практически делает то, что я написал раньше (если я ничего не упускаю?) Возможно, я виноват, что не объяснил это правильно.

(Ах да - я знаю, что это должно быть bool, это была ошибка - я просто игрался и забыл поменять их местами).

 
double TriggerBarTime = (i1>i2 .. 
это true или false 0 или 1 ничего больше
 int iTBT= iBarShift(NULL,60, TriggerBarTime, true),
Третий аргумент iBarShift должен быть временем. iBarShift(0) или (1) ВСЕГДА будет Bars-1.
 
datetime          TriggerBarTime;
У меня есть это в глобальном разделе...

Я не понимаю ваш предыдущий пост? ^

Возможно ли предложить, как мне написать строку If относительно моего поста выше вашего?
 
DomGilberto: У меня это находится в глобальном разделе...
И вы скрыли его с помощью локального объявления.
 
Извините, но это опять же не имеет смысла для меня...
 
DomGilberto: Извините, но это опять же не имеет смысла для меня...
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
}