Проблемы с проверкой открытой торговли - страница 2

 
dazamate:


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder, Этот код выглядит так просто, но я не могу понять, как он работает, разве оператор if не будет всегда истинным, если он делает time0 равным time[0] каждый раз, когда time0 равно time[0]? Я не говорю, что это не работает, но я просто не понимаю, как это работает в такой структуре.

1-й тик: Time0 не равно Time[0 ], поэтому return не выполняется,Time0 устанавливается в Time[0 ] (время начала текущего бара) и выполняется остальная часть функции start.

Второй и последующие тики: если Time0 по-прежнему равен времени начала текущего бара, то мы все еще находимся на том же баре, выполняется return и функция start завершается. Если Time0 не равно времени начала текущего бара, то мы находимся на новом баре, return не выполняется, Time0 устанавливается в Time[0] (время начала нового текущего бара), выполняется остальная часть функции start.

 
dazamate:

Как мне сделать счетчик, чтобы если отложенный ордер установлен и не срабатывает в течение x количества баров, то он должен быть отменен? Все, что я могу придумать, это установить счетчик для подсчета каждого нового бара и если количество подсчитанных баров == заданному допустимому количеству баров, то отложенные ордера отменяются. Счетчик баров сбрасывается каждый раз, когда открывается новый отложенный ордер? Как это звучит?

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

 
dazamate:

Я хочу сделать функцию, которая сканирует eurusd, usdchf, gbpusd, usdjpy на 1hr tf. Она возвращается к последней 06:00 gmt свече, записывает открытие, возвращается еще на 24 бара к предыдущей 06:00 gmt свече, записывает открытие и записывает диапазон 6gmt -6gmt для каждой пары. Затем сравнивает диапазон 6gmt - 6gmt всех пар и возвращает тот, который является самым высоким. Возможно ли, чтобы ea делала это, будучи привязанной к 1 временному графику?

Со всеми подобными проблемами, прежде чем думать о коде, вы должны сначала придумать решение... IMO. Создайте блок-схему или напишите псевдокод. Сначала найдите решение, которое имеет смысл... затем смотрите на код.

Чтобы ответить на ваш последний вопрос, да, это возможно сделать, например, чтобы получить значение открытия для определенной свечи из другой пары, чем та, на которой работает советник, я бы использовал...

iOpen( string symbol, int timeframe, int shift)

После того, как у вас есть значения для ярости 4 пар, вы можете легко определить наибольшее значение, используя что-то вроде этого:

  MathMax( double value4, (MathMax( double value3, (MathMax( double value1, double value2))))) ;

... или вы можете поместить значения в массив и использовать ArraySort ... обычно есть более чем один способ сделать что-либо, сначала вы должны иметь план того, как вы собираетесь решить свою проблему.

EDIT: имейте в виду, что некоторые из этих вещей не будут корректно работать с тестером стратегий.

 
extern int     iOpenHour                = 6;

int start()
  {
  
int b, scannedhour;
datetime bartime;
double dibsclose, dibsopen, prevdayrange;

for(b=0; b<=24; b++)                                   // scans the last 24 bars 
   {
      bartime = iTime("EURUSD", 60, b);                // checks the open time of each bar
      scannedhour = TimeHour(bartime);                 // extracts the hour of that bar
    
      if ( scannedhour == iOpenHour )                  // Check to see if scanned hour = Dibs hour
         {
            dibsclose    = iOpen("EURUSD", 60, b);     // Get the open value of that bar (Close of 6gmt day) 
            dibsopen     = iOpen("EURUSD", 60, b-24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange = (dibsclose-dibsopen);       // Calculate the range of the Dibs day
         }                                             // End of if statement
    }                                                  // End of for statement


Comment("Prev Dibs day range is...",prevdayrange, "dibsclose  =  ", dibsclose, "dibsopen  =  ",dibsopen, "Scannedhour=",scannedhour);      


   return(0);
  }

Итак, это моя попытка написать код, который будет сканировать часовой график eurusd, пока не найдет последний бар 06:00, запишет его открытие, вернется на 24 бара назад, чтобы записать открытие этого бара (начало дня 06:00) и получит диапазон open-open из этих двух выбранных баров.

Сюрприз-сюрприз, это не работает. Лол ------> http://myfacewhen.com/307/

Подскажите, что я напутал? Или я просто неправильно подошел к этому? Я пробовал, хе-хе.

 

Замечена одна проблема... 24 часа до b - это b+24 ... бары отсчитываются от текущего бара (0) влево.

dibsopen     = iOpen("EURUSD", 60, b-24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)

change to:

dibsopen     = iOpen("EURUSD", 60, b+24);  // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)

Молодец, что добавляешь комментарии, очень хорошая практика, чтобы вникнуть... :-)

 
RaptorUK:

Замечена одна проблема... 24 часа до b - это b+24 ... бары отсчитываются от текущего бара (0) влево.

Молодец, что добавляешь комментарии, очень хорошая практика, чтобы вникнуть... :-)


Вау, хорошо подмечено, мне бы потребовалось время, чтобы понять это lol. Не могу поверить, что я все правильно понял - эта глупая ошибка. Теперь я чувствую, что у меня что-то получается. Да, я добавил комментарии, чтобы помочь мне следить за тем, что я делаю, и чтобы вам, ребята, было проще понять, что я пытаюсь сделать. Теперь я собираюсь заставить его сравнить 4 пары и выплюнуть одну с наибольшей ценностью И дам вам знать, как я с этим справлюсь. Спасибо RaptorUK
 
Отличный материал, хорошо сделано. Не за что :-)
 
extern int     iOpenHour                = 6;

int start()
  {
                                                            //  Array Categorys ( 1  EURUSD, 2 GBPUSD, 3 USDCHF, 4 USDJPY )
int b[4], scannedhour[4];
datetime bartime[4];
double dibsclose[4], dibsopen[4], prevdayrange[4];

//----------------------------------------------------------------------------------------------
//        EURUSD PREV DAY RANGE CALC

for(b[1]=0; b[1]<=24; b[1]++)                               // scans the last 24 bars on eurusd
   {
      bartime[1] = iTime("EURUSD", 60, b[1]);               // checks the open time of each bar
      scannedhour[1] = TimeHour(bartime[1]);                // extracts the hour of that bar
    
      if ( scannedhour[1] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[1]    = iOpen("EURUSD", 60, b[1]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[1]     = iOpen("EURUSD", 60, b[1]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[1] = (dibsclose[1]-dibsopen[1]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement
    

//----------------------------------------------------------------------------------------------
//        GBPUSD PREV DAY RANGE CALC

for(b[2]=0; b[2]<=24; b[2]++)                               // scans the last 24 bars on eurusd
   {
      bartime[2] = iTime("GBPUSD", 60, b[2]);               // checks the open time of each bar
      scannedhour[2] = TimeHour(bartime[2]);                // extracts the hour of that bar
    
      if ( scannedhour[2] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[2]    = iOpen("GBPUSD", 60, b[2]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[2]     = iOpen("GBPUSD", 60, b[2]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[2] = (dibsclose[2]-dibsopen[2]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement



//----------------------------------------------------------------------------------------------
//        USDCHF PREV DAY RANGE CALC

for(b[3]=0; b[3]<=24; b[3]++)                               // scans the last 24 bars on eurusd
   {
      bartime[3] = iTime("EURUSD", 60, b[3]);               // checks the open time of each bar
      scannedhour[3] = TimeHour(bartime[3]);                // extracts the hour of that bar
    
      if ( scannedhour[3] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[3]    = iOpen("USDCHF", 60, b[3]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[3]     = iOpen("USDCHF", 60, b[3]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[3] = (dibsclose[3]-dibsopen[3]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement


//----------------------------------------------------------------------------------------------
//        USDJPY PREV DAY RANGE CALC

for(b[4]=0; b[4]<=24; b[4]++)                               // scans the last 24 bars on eurusd
   {
      bartime[4] = iTime("USDJPY", 60, b[4]);               // checks the open time of each bar
      scannedhour[4] = TimeHour(bartime[4]);                // extracts the hour of that bar
    
      if ( scannedhour[4] == iOpenHour )                    // Check to see if scanned hour = Dibs hour
         {
            dibsclose[4]    = iOpen("USDJPY", 60, b[4]);    // Get the open value of that bar (Close of 6gmt day) 
            dibsopen[4]     = iOpen("USDJPY", 60, b[4]+24); // Get the value of the bar 24 bars before the Dibs bar (Open of 6gmt day)
            prevdayrange[4] = (dibsclose[4]-dibsopen[4]);   // Calculate the range of the Dibs day
         }                                                  // End of if statement
    }                                                       // End of for statement




//----------------------------------------------------------------------------------------------



Comment("DIBS RANGE EURUSD:...", prevdayrange[1],        //Display Ranges of each pair
        "DIBS RANGE GBPUSD:...", prevdayrange[2],
        "DIBS RANGE USDCHF:...", prevdayrange[3],
        "DIBS RANGE USDJPY:...", prevdayrange[4]);      


   return(0);
  }
Итак, я превратил все переменные в массивы и запустил проверки для каждой из них. Теперь это перестало работать. Можно ли использовать несколько циклов for?
 
dazamate:
Итак, я превратил все переменные в массивы и запустил проверки для каждой из них. Теперь это перестало работать. Можно ли использовать несколько циклов for?
Да, можно, без проблем, но не используйте массив в индексе цикла for, вы можете использовать b каждый раз, если хотите. Он сбрасывается в 0 в каждом цикле for, так что повторное использование не проблема. Для чего на самом деле НУЖНО использовать массив? Разве не только для значений диапазона?
 
RaptorUK:
Да, вы можете, без проблем, но не используйте массив в индексе цикла for, вы можете использовать b каждый раз, если хотите. Он сбрасывается в 0 в каждом цикле for, так что повторное использование не проблема. Для чего вам на самом деле НУЖНО использовать массив? Разве не только для значений диапазона?
Аххх да, я понял, о чем вы говорите, я исправлю это и посмотрю, как пойдет. Быстрые ответы, я верну тебе $$$, если эта программа сделает меня богатым lol
Причина обращения: