Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1243

 

Eu não tenho o menor desejo de pesquisar ou ler, então abri o arquivo 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); 
}
//+------------------------------------------------------------------+
 

Qual é a melhor maneira de fazer no indicador, iniciar um timer de 1s ou comparar tempos (segundos) na OnCalculate

<1sec, saída

ou existem outras opções de trabalho?

necessidade de atualizar o HistorySelect para o mês + trabalho com objetos

 
Fast235:

ou em OnCalculate compare time (segundos)

<1sec, saída

O problema é com a data - não pode ser menos de um segundo.

comparar pelo menos milissegundos

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:

o que é melhor fazer no indicador, para iniciar um temporizador 1s ou no OnCalculate para comparar o tempo (segundos)


não é importante onde fazê-lo, a única coisa que a OnCalculate está relacionada a carrapatos - não haverá carrapato e, portanto, não haverá chamada OnCalculate

Fast235:

você precisa atualizar o HistorySelect por um mês + trabalhar com objetos

HistóriaSelect é rápido, mas quando você vai para mover ou criar objetos, pode haver atrasos, se objetos acima de 1000 +

e você estará modificando esses objetos a cada segundo


(digite seu código e as armadilhas irão aparecer ))))

 

um segundo é suficiente para mim e menos vezes até que o tique chegue

para eu exibir os negócios no gráfico + resultado do comércio sobre barras, e algumas informações semi-estáticas, como a tendência global

pode observar o preço da mudança de

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

ou tempo a partir da segunda opção

 

Por favor, me diga!

Como posso comparar o símbolo do gráfico atual com o que eu preciso?

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

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

Preciso que o programa abra uma ordem no AUD/USD, então ele abre a ordem (funciona corretamente). No entanto, o programa tenta abrir a ordem em outros gráficos abertos(o robô está rodando em vários pares de moedas) e retorna um erro de preço para os outros pares de moedas onde o Expert Advisor está rodando. Tenho que fazer uma comparação e se Symbol() == é igual ao símbolo no qual a ordem deve ser aberta, então a abrimos e se não, saímos. Não encontrei em nenhum lugar como definir o nome do símbolo a partir do terminal e fazer a comparação.

 
Denis Diakonov:

Por favor, me diga!

Como posso comparar o símbolo do gráfico atual com o que eu preciso?

Preciso que o programa abra uma ordem no AUD/USD, então ele abre a ordem (funciona corretamente). No entanto, o programa tenta abrir a ordem em outros gráficos abertos(o robô está rodando em vários pares de moedas) e retorna um erro de preço para os outros pares de moedas onde o Expert Advisor está rodando. Tenho que fazer uma comparação e se Symbol() == é igual ao símbolo no qual a ordem deve ser aberta, então a abrimos e se não, saímos. Não encontrei em nenhum lugar como definir o nome do símbolo do terminal e fazer comparações.

Há um exemplo de obter os preços certos no final.

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

Obrigado, mas eu não preciso dos preços certos. Os preços estão bem. Eu preciso que o EA não abra uma ordem se o par de moedas no qual a ordem é aberta não for o mesmo que o atual gráfico aberto ao qual o robô está anexado. Talvez possamos implementar isto abrindo um novo gráfico com um cronograma, abrir uma ordem desejada no mesmo e depois fechar o gráfico.

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

Não, não funciona dessa forma.

Meu programa acessa o gráfico atual, atribui a ele o nome do instrumento atual e o sela em uma variável, depois compara o valor desta variável com o símbolo atual no gráfico. Na verdade, ele o compara a si mesmo)))) Eu preciso de alguma forma converter Sympol() para qualquer valor com o qual qualquer outra variável possa ser comparada. Por exemplo:

AUDUSD;

(Símbolo() == AUDUSD)

Eu consegui de alguma forma fazê-lo - enquanto eu estava me regozijando e mudando tudo corretamente - nada mais funciona))

 
Denis Diakonov:

Não, não funciona dessa forma.

Meu programa acessa o gráfico atual, atribui a ele o nome do instrumento atual e o sela em uma variável, depois compara o valor desta variável com o símbolo atual no gráfico. Na verdade, ele o compara a si mesmo)))) Eu preciso de alguma forma converter Sympol() para qualquer valor com o qual qualquer outra variável possa ser comparada. Por exemplo:

AUDUSD;

(Símbolo() == AUDUSD)

Eu consegui de alguma forma, até ficar feliz e mudar tudo corretamente - nada funciona))

corda AUDUSD = "AUDUSD";

Pelo menos assim.

 
Denis Diakonov:

Não, não funciona dessa forma.

Meu programa acessa o gráfico atual, atribui a ele o nome do instrumento atual e o sela em uma variável, depois compara o valor desta variável com o símbolo atual no gráfico. Na verdade, ele o compara a si mesmo)))) Eu preciso de alguma forma converter Sympol() para qualquer valor com o qual qualquer outra variável possa ser comparada. Por exemplo:

AUDUSD;

(Símbolo() == AUDUSD)

Eu consegui fazer isso de alguma forma, e enquanto eu estava me regozijando e mudando tudo corretamente - nada mais funcionou))

O Expert Advisor, o roteiro, o indicador não se aplicam, mas trabalham na janela atual. E as variáveis globais de diferentes janelas / gráficos não se sobrepõem. Portanto, deve funcionar)

Esta é uma variável de texto, que inicialmente está vazia, ou seja, é igual a "".

(Symbol() == AUDUSD) // esta string não tem nada a ver com a variável AUDUSD.

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

Mas o critério de abertura do pedido não deve ser o mesmo para instrumentos/janelas diferentes. Se eles forem os mesmos, eles realmente se abrirão em todas as janelas.

Razão: