Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1243

 

ни малейшего желания гуглить и читать у меня нет, вот открыл файл D:\1.txt

/*
https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew
HINSTANCE ShellExecuteW(
  HWND    hwnd,
  LPCWSTR lpOperation,
  LPCWSTR lpFile,
  LPCWSTR lpParameters,
  LPCWSTR lpDirectory,
  INT     nShowCmd
);
*/
#import "shell32.dll"
int ShellExecuteW(int hWnd, string lpVerb, string lpFile, string lpParameters, string lpDirectory, int nCmdShow);
#import
#define SW_SHOW 5
#define SW_SHOWNORMAL 1
//+------------------------------------------------------------------+
void OnStart()
{
   ShellExecuteW(NULL,"Open","notepad.exe","D:\\1.txt",NULL,SW_SHOW); 
}
//+------------------------------------------------------------------+
 

как лучше сделать в индикаторе, запустить таймер 1сек или в OnCalculate сравнивать время (секунды) 

<1сек, выход

или есть другие рабочие варианты?

нужно обновлять HistorySelect за месяц + работа с объектами

 
Fast235:

или в OnCalculate сравнивать время (секунды) 

<1сек, выход

секунды маловато будет, дело в datetime - он меньше секунды не может быть

сравнивайте хотя бы милисекунды

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const LastOnCalculate = GetTickCount(); &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   static uint LastOnCalculate = GetTickCount();
   if(GetTickCount() - LastOnCalculate < 1000) return(rates_total);
   LastOnCalculate = GetTickCount();
   .........
   return(rates_total);
}
Fast235:

как лучше сделать в индикаторе, запустить таймер 1сек или в OnCalculate сравнивать время (секунды) 


по моему не принципиально где делать, единственное OnCalculate  привязан к тикам - не будет тика, соответственно  не будет вызова OnCalculate 

Fast235:

нужно обновлять HistorySelect за месяц + работа с объектами

HistorySelect   быстрый, а вот заходите обекты перемещать или создавать тут могут быть лаги, если обьектов под 1000 + 

и будете каждую секунду эти обьекты модифицировать


в общем пишите код, там по ходу сразу и всплывут подводные камни )))

 

секунды достаточно мне будет и реже пока тик не пришел

мне для отображения сделок на графике + результат сделки над барами, и некоторая полустатическая инфа типа тренда глобального

может price смотреть изменение из

int OnCalculate (const int rates_total,      // размер массива price[] 
                 const int prev_calculated,  // обработано баров на предыдущем вызове 
                 const int begin,            // откуда начинаются значимые данные 
                 const double& price[]       // массив для расчета 
   );

или тайм из второго варианта

 

Подскажите пожалуйста! 

Каким образом возможно произвести сравнение текущего символа графика с нужным мне?

      case 1 : // кейс для открытия Buy по AUD/USD
               if(Symbol() == (как обозначить нужный символ для сравнения?))                                    // если символ текущего графика AUD/USD открываем сделку
               {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_BUY,Lot(),Ask,0,0,0); // Открытие ордера
//----------------------------------------------------------------------------------------------------
В тоже время советник запущен на другом графике и пытается произвести открытие ордера, цены не совпадают и соответственно вылетает ошибка - неверные цены

      case 2 : // кейс для открытия Bay по GBP/USD 
               if(Symbol() == (как обозначить нужный символ для сравнения?)) 
// если символ текущего графика не AUDUSD то выходим
               {
                  RefreshRates();
                  Open_Order = OrderSend("GBPUSD",OP_SELL,Lot(),Bid,0,0,0); // Открытие ордера

Т.е. надо ему дать понять, что тот или иной кейс принадлежит тому или другому графику, но чтот я пока не придумал как

Мне нужно, чтобы программа понимала, что нужно открыть ордер по паре AUD/USD и она его открывает(это работает как надо), но при этом она пытается открыть этот ордер и по другим открытым графикам(робот запущен на нескольких валютных парах), что возвращается ошибкой цен соответственно для других валютных пар, где запущен советник. Вот мне надо сделать сравнение, если Symbol() == равен тому символу по которому необходимо открыть ордер, то открываем, а если нет, то выходим. Что-то я нигде не наковырял как переменной задать имя символа из терминала и произвести сравнение.

 
Denis Diakonov:

Подскажите пожалуйста! 

Каким образом возможно произвести сравнение текущего символа графика с нужным мне?

Мне нужно, чтобы программа понимала, что нужно открыть ордер по паре AUD/USD и она его открывает(это работает как надо), но при этом она пытается открыть этот ордер и по другим открытым графикам(робот запущен на нескольких валютных парах), что возвращается ошибкой цен соответственно для других валютных пар, где запущен советник. Вот мне надо сделать сравнение, если Symbol() == равен тому символу по которому необходимо открыть ордер, то открываем, а если нет, то выходим. Что-то я нигде не наковырял как переменной задать имя символа из терминала и произвести сравнение.

Там в конце есть пример получения правильных цен.

SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
SymbolInfoDouble - Получение рыночной информации - Справочник MQL4
  • docs.mql4.com
2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром. Если функция используется для получения информации о последнем тике, то лучше использовать SymbolInfoTick(). Вполне возможно, что по данному символу с...
 
Denis Diakonov:

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

string  symbol;
....
int OnInit()
{...
 symbol=Symbol();
....
}
void OnTick()
...
 if(symbol == Symbol())
{
...//открываем ордер
}
....
 
Valeriy Yastremskiy:
Valeriy Yastremskiy:

не, так не канает.

У меня программа обращается к текущему графику, присваивает ей имя текущего инструмента и запечатывает её в переменную, потом сравнивает значение этой переменной с текущим символом на графике. Собственно оно само с собой сравнивается))) надо как-то преобразовать Sympol() в любое значение с которым можно сравнить любую другую переменную. Например:

string AUDUSD;

(Symbol() == AUDUSD)

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

 
Denis Diakonov:

не, так не канает.

У меня программа обращается к текущему графику, присваивает ей имя текущего инструмента и запечатывает её в переменную, потом сравнивает значение этой переменной с текущим символом на графике. Собственно оно само с собой сравнивается))) надо как-то преобразовать Sympol() в любое значение с которым можно сравнить любую другую переменную. Например:

string AUDUSD;

(Symbol() == AUDUSD)

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

string AUDUSD = "AUDUSD";

Хотябы так.

 
Denis Diakonov:

не, так не канает.

У меня программа обращается к текущему графику, присваивает ей имя текущего инструмента и запечатывает её в переменную, потом сравнивает значение этой переменной с текущим символом на графике. Собственно оно само с собой сравнивается))) надо как-то преобразовать Sympol() в любое значение с которым можно сравнить любую другую переменную. Например:

string AUDUSD;

(Symbol() == AUDUSD)

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

Советник, скрипт, индикатор не обращаются, а работают в текущем окне. И глобальные переменные разных окон / чартов не пересекаются. Поэтому должно работать)

string AUDUSD; // Это текстовая переменная, к тому же изначально пустая т.е. равная ""

(Symbol() == AUDUSD) // эта строка к переменной  AUDUSD отношения не имеет.

Symbol
Возвращает имя символа текущего графика.
string  Symbol();
Возвращаемое значение
Значение системной переменной _Symbol, в которой хранится имя символа текущего графика.

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

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