Проблемы с проверкой открытой торговли

 

Привет, я добавил это в свой код, чтобы проверить, есть ли уже открытая сделка. Проблема в том, что код выполнит одну сделку и все. Может ли кто-нибудь увидеть проблему с этим кодом. Я не супер эксперт в программировании


// Проверяем наличие открытых сделок

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol())
{
tradeopen=true;
}
else
{
tradeopen=false;
}

}

}

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

Спасибо Raptor за быстрый ответ.


Если вы не возражаете, я приложу весь код, возможно, я что-то упустил. В данный момент я уперся в стену.

Файлы:
daz.mq4  3 kb
 
dazamate:
Может ли кто-нибудь увидеть проблему в этом коде.

  1. Отсутствие магического числа означает, что он несовместим с любым другим советником и ручной торговлей и самим собой на той же паре/разных таймфреймах.
  2. Если первый открытый ордер был не советника, то флаг ложный, даже если у него есть открытые сделки.
    int TotalOrderCount(){
        int count=0;
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
            count++;
        }
        return(count);
    }

 
dazamate:

Спасибо Raptor за быстрый ответ.


Если вы не возражаете, я приложу весь код, возможно, я что-то упустил. На данный момент я уперся в стену.

Несколько комментариев...

Вы объявляете i...

int i;

... но нигде не задаете его, что такое i?

Вы объявляете ...

static bool tradeopen = false;

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

if(OrderSymbol()==Symbol())
    {
    tradeopen=true;
    }  

счетчик баров установлен на 0

static int barcount = 0;

так что это всегда будет истиной, если на вашем графике есть хотя бы 1 бар...

if(Bars != barcount)

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

 

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

В ответ на ваши комментарии

int i;

Его нет, я использовал его для чего-то другого и случайно оставил его там.


Я объясню, что происходит в моей голове в отношении барной стойки. Я все еще не уверен, почему эта часть кода не работает.

static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if(Bars != barcount) // <-  This will be true so the if statement is allowed to run
    
       {      
         if(iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount=Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

Что касается проверки, есть ли открытые сделки по паре...

static bool tradeopen = false;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)         {           if(OrderSelect(cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if(OrderSymbol()==Symbol()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

В конце работы ea проверяет, открыта ли сделка по текущей паре или нет. Устанавливает tradeopen в true или false. Является ли проблемой то, что эта часть кода используется в конце советника?

И еще одна проблема, которую я не могу решить...

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);
Почему iBarHour всегда возвращает 1? Я хочу, чтобы он возвращал текущий час :(


WHRoeder


Имеет ли значение, использует ли советник магическое число или нет. Может ли он просто проверить все открытые и отложенные сделки, и если среди них есть текущая пара?


Еще раз, ребята, я знаю, что я новичок, но все ваши советы ценятся, я знаю, что меня, вероятно, снова будут рвать на части из-за моего изворотливого кодирования :P


Спасибо

 
dazamate:

Я объясню, что происходит в моей голове в отношении счетчика. Я все еще не уверен, почему эта часть кода не работает.

Извините, возможно, я показываю свое невежество в использовании статических переменных. . . Я использую глобальные переменные, и все, что я хочу установить при инициализации кода, я помещаю в функцию init . https://docs.mql4.com/basis/functions/special.

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

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);

Если этот код работает, то dDayOpenPrice будет установлен только пока iBarHour = 6, когда iBarHour = 7 dDayOpenPrice больше не будет установлен на правильное значение. Если сделать dDayOpenPrice глобальным, то его значение будет сохраняться во время работы кода (возможно, подойдет и статический вариант). При перезапуске кода ничего не произойдет до следующего дня, хотя ... не до 6-часового бара.

WHRoeder

Имеет ли значение, использует ли советник магическое число или нет. Не может ли он просто проверить все открытые и отложенные сделки, и если среди них есть текущая пара?

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

 

RaptorUK, еще раз спасибо.


Я тестирую ea, чтобы проверить, работает ли код и Print() переменной, чтобы увидеть, что происходит в них, чтобы помочь отладить код. Код ibarhour, кажется, работает правильно, просто он не отображался должным образом в бэктесте, потому что я настроил его на постоянную печать значения ibarhour, и он не может отобразить его достаточно быстро, как код выплевывает его, поэтому бэктестер застревает. Может быть, есть способ поставить задержку на код печати?



Также да, я хочу, чтобы он сохранял значение открытия бара 06:00 :)
.


Я перестроил код, и я горжусь собой, я сделал так, чтобы он мог проверять, открыла ли ea какие-либо сделки на текущей паре. Я использовал примерWHRoeder и превратил его в отдельную функцию :) и заставил функцию возвращать true или false. Ура.



Поскольку вы, очевидно, являетесь элитой в области кодирования советников. Сколько историй успеха вы слышали от людей, создающих свои собственные советники? Я слышал/видел только плохие истории.











 
dazamate:

Поскольку вы, очевидно, являетесь элитой в области кодирования советников. Сколько историй успеха вы слышали от людей, создающих свои собственные советники? Я слышал/видел только плохие истории.











ЛОЛ . . ваш комментарий должен быть направлен на WHRoeder ,а не наменя, он гораздо, гораздо более опытный кодер, чем я, посмотрите некоторые из его недавних сообщений на код, которым он поделился, вы можете многому научиться, понимая его код, я знаю , что научился, спасибо WHRoeder :-).

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

Чтобы иметь успешный советник, сначала нужен успешный метод... Сколько их существует? Многие вещи работают в течение короткого периода времени, несколько вещей будут работать месяц или два, очень немногие работают постоянно. Даже если у кого-то есть хороший метод (откуда он может знать это без надлежащего тестирования, я не знаю), у него обычно нет знаний или способности превратить его в жизнеспособный советник. Тот, у кого есть жизнеспособный советник, вряд ли будет афишировать этот факт, он будет использовать его и зарабатывать деньги....

Рад слышать, что вы делаете успехи ... что касается проблемы Print, вы могли бы использовать Comment(iBarHour); вместо этого он выводится на экран в верхнем левом углу.

 
  1. Пожалуйста. "Чтобы научиться чему-то, практикуйтесь. Чтобы овладеть этим, учите".
  2. Bars - ненадежно (как только вы достигнете максимального количества баров на графике, оно не изменится и код сломается). Volume[0]==1 - ненадежно, если вы пропустите тик, код сломается. Всегда используйте время.
    int start(){
       static datetime Time0;
       if (Time0 == Time[0]) return; Time0 = Time[0];
       // A new bar has started.

  3. вероятно, показывая свое невежество в использовании статических переменных . . . Я использую глобальные переменные вместо этого и все, что я хочу установить при инициализации кодаЕсли
    переменная должна быть инициализирована, то она должна быть глобальной. Если переменная используется совместно двумя или более функциями, то она должна быть глобальной. В противном случае определите ее локально для функции, при необходимости статически.
  4. Имеет ли значение, использует ли советник магическое число или нет.
    Возможно, у вас все будет работать, потом вы откроете другой график, чтобы протестировать там, и вдруг все пойдет не так. Делайте все правильно с самого начала. В своем коде я проверяю и магическое число, и пару, на всякий случай я ставлю его на другой график, но не меняю магическое число.
 

Вы правы, Раптор... Извините, WHRoeder, это было грубо, я не поблагодарил вас. Это начало большого проекта для меня, так что я очень надеюсь, что вы, ребята, не против, что я вас достаю.


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]? Я не говорю, что это не работает, но я просто не понимаю, как это работает в такой структуре.


Еще 2 вопроса.

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

Следующий вопрос.

Этот вопрос я не знаю, как решить.

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


Еще раз спасибо за ваши знания, ребята и ваши пациенты

Причина обращения: