Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1243

 

No tengo el menor deseo de buscar en Google o leer, así que abrí el archivo 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); 
}
//+------------------------------------------------------------------+
 

¿Cuál es la mejor manera de hacerlo en el indicador, para iniciar el temporizador 1s o en OnCalculate para comparar el tiempo (segundos)

<1seg, salir

¿o hay otras opciones de trabajo?

necesidad de actualizar HistorySelect para el mes + trabajar con objetos

 
Fast235:

o en OnCalculate comparar el tiempo (segundos)

<1seg, salida

El problema es con el datetime - no puede ser menos de un segundo.

comparar al menos milisegundos

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:

¿qué es mejor hacer en el indicador, para iniciar un temporizador 1s o en OnCalculate para comparar el tiempo (segundos)


no es importante dónde hacerlo, lo único que OnCalculate está relacionado con los ticks - no habrá ningún tick y por lo tanto no habrá ninguna llamada OnCalculate

Fast235:

es necesario actualizar HistorySelect durante un mes + trabajar con objetos

HistorySelect es rápido, pero cuando vas a mover o crear objetos, puede haber retrasos, si los objetos superan los 1000 +

y usted estará modificando estos objetos cada segundo


(introduzca su código y aparecerán las trampas ))))

 

un segundo es suficiente para mí y menos a menudo hasta que la garrapata viene

para mostrar las operaciones en el gráfico + el resultado de la operación sobre las barras, y alguna información semiestática como la tendencia global

puede el precio ver el cambio de

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

o el tiempo de la segunda opción

 

Por favor, dímelo.

¿Cómo puedo comparar el símbolo del gráfico actual con el que necesito?

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

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

Necesito que el programa abra una orden en AUD/USD, así que abre la orden (funciona correctamente). Sin embargo, el programa intenta abrir la orden en otros gráficos abiertos(el robot está funcionando en varios pares de divisas) y devuelve un error de precio para los otros pares de divisas en los que se está ejecutando el Asesor Experto. Tengo que hacer una comparación y si Symbol() == es igual al símbolo sobre el que se debe abrir la orden, entonces la abrimos y si no, salimos. No he encontrado en ningún sitio cómo poner el nombre del símbolo desde el terminal y hacer la comparación.

 
Denis Diakonov:

Por favor, dímelo.

¿Cómo puedo comparar el símbolo del gráfico actual con el que necesito?

Necesito que el programa abra una orden en AUD/USD, así que abre la orden (funciona correctamente). Sin embargo, el programa intenta abrir la orden en otros gráficos abiertos(el robot está funcionando en varios pares de divisas) y devuelve un error de precio para los otros pares de divisas en los que se está ejecutando el Asesor Experto. Tengo que hacer una comparación y si Symbol() == es igual al símbolo sobre el que se debe abrir la orden, entonces la abrimos y si no, salimos. No he encontrado en ningún sitio cómo poner el nombre del símbolo desde el terminal y hacer la comparación.

Al final hay un ejemplo de cómo conseguir los precios correctos.

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

Gracias, pero no necesito los precios correctos. Los precios están bien. Necesito que el EA no abra una orden si el par de divisas en el que se abre la orden no es el mismo que el gráfico abierto actual al que está unido el robot. Tal vez podamos implementar esto abriendo un nuevo gráfico con un marco de tiempo, abrir una orden deseada en él y luego cerrar el gráfico.

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

No, no funciona así.

Mi programa accede al gráfico actual, le asigna el nombre del instrumento actual y lo sella en una variable, luego compara el valor de esta variable con el símbolo actual del gráfico. En realidad lo compara consigo mismo)))) Necesito convertir de alguna manera Sympol() a cualquier valor con el que se pueda comparar cualquier otra variable. Por ejemplo:

AUDUSD;

(Símbolo() == AUDUSD)

De alguna manera lo he conseguido - mientras me alegraba y cambiaba todo correctamente - ya no funciona nada))

 
Denis Diakonov:

No, no funciona así.

Mi programa accede al gráfico actual, le asigna el nombre del instrumento actual y lo sella en una variable, luego compara el valor de esta variable con el símbolo actual del gráfico. En realidad lo compara consigo mismo)))) Necesito convertir de alguna manera Sympol() a cualquier valor con el que se pueda comparar cualquier otra variable. Por ejemplo:

AUDUSD;

(Símbolo() == AUDUSD)

Lo he conseguido de alguna manera, hasta que he sido feliz y he cambiado todo correctamente - nada funciona))

cadena AUDUSD = "AUDUSD";

Al menos así.

 
Denis Diakonov:

No, no funciona así.

Mi programa accede al gráfico actual, le asigna el nombre del instrumento actual y lo sella en una variable, luego compara el valor de esta variable con el símbolo actual del gráfico. En realidad lo compara consigo mismo)))) Necesito convertir de alguna manera Sympol() a cualquier valor con el que se pueda comparar cualquier otra variable. Por ejemplo:

AUDUSD;

(Símbolo() == AUDUSD)

Lo hice de alguna manera, y mientras me alegraba y cambiaba todo, ya no funcionaba nada))

El Asesor Experto, el script, el indicador no se aplican, sino que trabajan en la ventana actual. Y las variables globales de diferentes ventanas / gráficos no se superponen. Por lo tanto, debería funcionar)

string AUDUSD; // Esta es una variable de texto, que inicialmente está vacía, es decir, es igual a ""

(Symbol() == AUDUSD) // esta cadena no tiene nada que ver con la variable AUDUSD.

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

Pero los criterios de apertura de la orden no deben ser los mismos para diferentes instrumentos/ventanas. Si son iguales, se abrirán efectivamente en todas las ventanas.