新人对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); 
}
//+------------------------------------------------------------------+
 

在指标中,启动一个1s的计时器或在OnCalculate中比较时间(秒)的最佳方法是什么?

<1秒,退出

还是有其他的工作选择?

需要更新本月的HistorySelect+与对象一起工作

 
Fast235:

或在OnCalculate中比较时间(秒)。

<1秒,输出

问题出在数据时间上--它不能少于一秒钟。

至少在毫秒内进行比较

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:

在指标中做什么比较好,是启动一个1s的计时器还是在OnCalculate中比较时间(秒)?


在哪里做并不重要,唯一重要的是OnCalculate与ticks有关--没有tick,因此就没有OnCalculate调用。

Fast235:

你需要在一个月内更新HistorySelect +与对象一起工作

HistorySelect 的速度很快,但当你去移动或创建对象时,可能会出现滞后,如果对象超过1000+,就会出现滞后。

而你将每秒钟都在修改这些对象


(输入你的代码,陷阱就会弹出来 ))))

 

对我来说,一秒钟就够了,而且在打勾之前要少点。

为我在图表上显示交易+交易结果 的条形图,以及一些半静态的信息,如全球趋势。

可以价格看变化,从

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); // Открытие ордера

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

我需要程序在澳元/美元上打开订单,所以它打开了订单(工作正常)。 然而,程序试图在其他打开的图表 上打开订单(机器人在几个货币对上运行),对于专家顾问正在运行的其他货币对,它返回一个价格错误。我必须进行比较,如果Symbol()==等于订单应该打开的符号,那么我们就打开它,如果不是,我们就退出。我没有在任何地方找到如何从终端设置符号名称并进行比较。

 
Denis Diakonov:

请告诉我!

我怎样才能将当前的图表符号与我需要的符号进行比较?

我需要程序在澳元/美元上打开订单,所以它打开了订单(工作正常)。 然而,程序试图在其他打开的图表 上打开订单(机器人在几个货币对上运行),对于 专家顾问正在运行的其他货币对,它返回一个价格错误。我必须进行比较,如果Symbol()==等于订单应该打开的符号,那么我们就打开它,如果不是,我们就退出。我没有找到任何地方可以从终端设置符号名称并进行比较。

最后有一个获得正确价格的例子。

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

谢谢你,但我不需要合适的价格。价格很好。我需要EA在开仓的货币对与机器人所连接的当前开仓图表 不一致的情况下不开单。也许我们可以通过打开一个带有时间框架的新图表来实现这一点,在其中打开一个想要的订单,然后关闭图表。

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

不,它不是那样工作的。

我的程序访问当前的图表,为其分配当前工具的名称并将其封入一个变量,然后将这个变量的值与图表上的当前符号进行比较。它实际上是将其与自身进行比较)))),我需要以某种方式将Sympol()转换为任何其他变量可以比较的值。比如说。

澳元兑美元。

(Symbol()== AUDUSD)

我不知不觉地做到了--在我欢欣鼓舞并正确地改变一切的时候--一切都不灵了))

 
Denis Diakonov:

不,它不是那样工作的。

我的程序访问了当前的图表,给它指定了当前工具的名称,并将其封入一个变量,然后将这个变量的值与图表上的当前符号进行比较。它实际上是将其与自身进行比较)))),我需要以某种方式将Sympol()转换为任何其他变量可以比较的值。比如说。

澳元兑美元。

(Symbol() == AUDUSD)

我已经设法做到了,直到我很高兴,并正确地改变了一切--没有什么作用))

string AUDUSD = "AUDUSD";

至少像这样。

 
Denis Diakonov:

不,它不是那样工作的。

我的程序访问了当前的图表,给它指定了当前工具的名称,并将其封入一个变量,然后将这个变量的值与图表上的当前符号进行比较。它实际上是将其与自身进行比较)))),我需要以某种方式将Sympol()转换为任何其他变量可以比较的值。比如说。

澳元兑美元。

(Symbol() == AUDUSD)

我莫名其妙地做到了,当我欣喜若狂,改变一切的时候,一切都不灵了))

专家顾问、脚本、指标并不适用,而是在当前窗口工作。而不同窗口/图表的全局变量 不会重叠。因此,它应该是有效的)

string AUDUSD; // 这是一个文本变量,最初是空的,也就是等于""。

(Symbol() == AUDUSD) //这个字符串与变量AUDUSD没有 关系。

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

但不同的工具/窗口的开单标准不应相同。如果它们是相同的,它们确实会在所有窗口中打开。