Eu tenho uma pergunta infantil. As variáveis são declaradas no cabeçalho do código. Eles devem ser globais. Mas eu não entendo a diferença
de
se esta variável for declarada no cabeçalho. Idealmente, pelo escopo da variável. Mas, em ambos os casos, é visível dentro da função. Eu fiz um teste (roteiro):
- Não notei nenhuma diferença. Você pode explicar sua diferença, porque eu não a entendo.
Há um statik extra lá dentro. Também funcionará sem ele. Faz sentido declarar estática dentro das funções. Apenas o escopo do bloco de funções.
Zhunko: Faz sentido declarar estática dentro das funções. O escopo é apenas um bloco de funções.
Funciona da mesma maneira:
int a = 10;
int start(){
Alert(StringConcatenate("st: a = ", a));//st: a = 10
f1(); Alert(StringConcatenate("f1: a = ", a));//f1: a = 10
f2(); Alert(StringConcatenate("f2: a = ", a));//f2: a = 10
}
void f1(){
int a = 11;
return;
}
void f2(){
staticint a = 12;
return;
}
Em que caso a diferença será sentida? ALXIMIKS, obrigado pela resposta também.
Você pode me dizer como instalar um indicador/robô adicional em um mt4 instalado em um iphone/ipad? É, em princípio, possível? Com o Windows é elementar simples, mas com os produtos móveis Apple não é tão óbvio.
A lógica diz que isso é possível. Afinal, uma série de indicadores já estão pré-instalados. Mas o que e onde copiar não está claro, a estrutura do arquivo é diferente. Alguém ainda não encontrou tal problema?
Estou fazendo um indicador baseado em médias móveis. A idéia é cortar movimentos insignificantes dentro de pontos específicos. Digamos que colocamos um filtro de 50 pips. O indicador está diminuindo, mas a diminuição é inferior a 50 pips, portanto pegamos o valor da média de ontem e o anotamos e estabelecemos seu nível para a data atual. Na barra seguinte verificamos a diferença, o valor atual menos o valor registrado, se o total não exceder 50 pips, definimos o nível que está armazenado na variável estática para o valor atual. Se o valor o excede, o valor se torna o valor atual, ou seja, semelhante a uma média móvel com um deslocamento de zero.Tentei variações diferentes, mas até agora não encontrei a solução certa.
Por uma questão de simplicidade, estou anexando o código para desenhar apenas os declínios. O problema é que o indicador está em ascensão. E o principal é que quando o analiso no testador posso ver o indicador mudando visualmente, enquanto não há saída fora do filtro. Presumo que em algum lugar o valor do valor registrado "MA_otshet" seja perdido.
#property indicator_chart_window#property indicator_buffers1#property indicator_color1 Red
//--- input parameters//--- buffersdouble ExtMapBuffer1[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int init()
{
//---- indicatorsSetIndexStyle(0,DRAW_LINE,0,1);
SetIndexBuffer(0,ExtMapBuffer1);
IndicatorDigits(Digits+1);
//----return(0);
}
//+------------------------------------------------------------------+//| Custom indicator deinitialization function |//+------------------------------------------------------------------+int deinit()
{
return(0);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+int start()
{
int counted_bars=IndicatorCounted(),
limit;
double
raznica,raznica_static,MA_0_t,MA_1_t;
staticdouble MA_otshet; //здесь хранится запись значения MA_otshetfor(int i=0;i<Bars;i++)
{
MA_0_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+0);
MA_1_t=iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,i+1);
raznica=MA_0_t-MA_1_t; //разница между сегодня и вчера по скользящей средней
raznica_static=MA_0_t-MA_otshet; //разница между сегодня и MA_otshetif(raznica > -0.005 && raznica <= 0) // если raznica не превышает заданное число
{
MA_otshet=MA_1_t; // записываем значение MA_otshet
}
if(raznica_static > - 0.005 && raznica_static <= 0) //если raznica_static не превышает заданное число
{
ExtMapBuffer1[i]=MA_otshet; // то рисуем значение индикатора, как записанный MA_otshet
}
if(raznica_static < - 0.005) // если raznica превышает заданное число
{
ExtMapBuffer1[i]=MA_0_t; // то рисуем значение по текущей цене
}
}
return(0);
}
//+------------------------------------------------------------------+
Preciso que todas as ordens sejam fechadas às 23:55 e na sexta-feira as negociações terminam às 22:00, então há um problema com a negociação
encontrei no roteiro do tutorial na seção de tempo ajuda por favor adicione o número do parâmetro do dia, ou seja, os pedidos de sexta-feira foram fechados às 21 55 e nos dias normais às 23 55 ou pode compartilhar o link se houver soluções prontas
//--------------------------------------------------------------------// timeevents.mq4// Предназначен для использования в качестве примера в учебнике MQL4.//--------------------------------------------------------------- 1 --externdoubleTime_Cls=16.10; // Время закрытия ордеровboolFlag_Time=false; // Флаг, сообщения ещё не было //--------------------------------------------------------------- 2 --intstart()// Спец. функция start{intCur_Hour=Hour(); // Серверное время в часахdoubleCur_Min =Minute(); // Серверное время в минутахdoubleCur_time=Cur_Hour + Cur_Min100; // Текущее времяAlert(Cur_time);
if(Cur_time>=Time_Cls)// Если наступило время событияExecutor(); //.. то выполняем задуманноеreturn; // Выход из start()}//--------------------------------------------------------------- 3 --intExecutor()// Пользовательская функция{if(Flag_Time==false)// Если ещё не было сообщения..{// .. то сообщаем (1 раз)Alert("Время важных новостей. Закройте ордера.");
Flag_Time=true; // Теперь сообщение уже было}return; // Выход из польз. функции}
Obrigado. Mas, você pode me dar uma dica? Eu só preciso de 1 dia. Ou seja, para exibir as informações de lucro do último dia útil
As variáveis são declaradas. Não funciona. Tudo isso é nulo.
for (p=0; p<OrdersHistoryTotal(); p++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )
p0+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
double r0=p0*100/AccountBalance();
Este Expert Advisor tem a biblioteca MM_Light e a função nela contida:
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+//| Автор : TarasBY, taras_bulba@tut.by |//+-----------------------------------------------------------------------------------+//| Считаем итоги работы по своим ордерам |//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+double fCalculate_Pribul (int fi_OP = -2, // тип (BUY\SELL) учитываемых ордеровdatetime fdt_TimeBegin = 0, // момент времени, с которого производим расчётstring fs_Comment = "") // комментарий ордеров
{
double ld_Pribul = 0.0;
int history_total = OrdersHistoryTotal();
//----for (int li_ORD = 0; li_ORD < history_total; li_ORD++)
{
if (!fCheck_MyOrders (li_ORD, fi_OP, MODE_HISTORY)) continue;
if (fdt_TimeBegin > OrderCloseTime()) continue;
if (fs_Comment != "") {if (StringFind (OrderComment(), fs_Comment) < 0) continue;}
ld_Pribul += (OrderProfit() + OrderSwap() + OrderCommission());
}
//----return (ld_Pribul);
}
O princípio não é difícil de entender. Para calcular o lucro/perda para o dia atual, é necessário passar o valor: fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "").
Preciso que todas as ordens sejam fechadas às 23:55 e na sexta-feira as negociações terminam às 22:00, então há um problema com a negociação
encontrei no roteiro do tutorial na seção de tempo ajuda por favor adicione o número do parâmetro do dia, ou seja, os pedidos de sexta-feira foram fechados às 21 55 e nos dias normais às 23 55 ou pode compartilhar o link se houver soluções prontas
É claro que o código foi escrito no rascunho, mas ele deve funcionar, pelo menos você deve entendê-lo
int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.case4://пятницаcase5://суббота на всякий случайcase6://воскресенье на всякий случайif((Hour()==22 && Minute()>=00) || Hour()>22){
// Выполняем какое то действие в пятницу после 22:00
}
break;
case0://понедельникcase1://вторникcase2://средаcase3://четвергif(Hour()>23 || (Hour()==23 && Minute()>55)){
// все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
}
break;
default: {//все остальные действия в нормальные рабочии дни до 23:55
}
}
}
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Eu tenho uma pergunta infantil. As variáveis são declaradas no cabeçalho do código. Eles devem ser globais. Mas eu não entendo a diferença
de
se esta variável for declarada no cabeçalho. Idealmente, pelo escopo da variável. Mas, em ambos os casos, é visível dentro da função. Eu fiz um teste (roteiro):
- Não notei nenhuma diferença. Você pode explicar sua diferença, porque eu não a entendo.
Faz sentido declarar estática dentro das funções. O escopo é apenas um bloco de funções.
Funciona da mesma maneira:
Em que caso a diferença será sentida? ALXIMIKS, obrigado pela resposta também.
Olá!
Você pode me dizer como instalar um indicador/robô adicional em um mt4 instalado em um iphone/ipad? É, em princípio, possível? Com o Windows é elementar simples, mas com os produtos móveis Apple não é tão óbvio.
A lógica diz que isso é possível. Afinal, uma série de indicadores já estão pré-instalados. Mas o que e onde copiar não está claro, a estrutura do arquivo é diferente. Alguém ainda não encontrou tal problema?
Obrigado de antemão.
Estou fazendo um indicador baseado em médias móveis . A idéia é cortar movimentos insignificantes dentro de pontos específicos. Digamos que colocamos um filtro de 50 pips. O indicador está diminuindo, mas a diminuição é inferior a 50 pips, portanto pegamos o valor da média de ontem e o anotamos e estabelecemos seu nível para a data atual. Na barra seguinte verificamos a diferença, o valor atual menos o valor registrado, se o total não exceder 50 pips, definimos o nível que está armazenado na variável estática para o valor atual. Se o valor o excede, o valor se torna o valor atual, ou seja, semelhante a uma média móvel com um deslocamento de zero.Tentei variações diferentes, mas até agora não encontrei a solução certa.
Por uma questão de simplicidade, estou anexando o código para desenhar apenas os declínios. O problema é que o indicador está em ascensão. E o principal é que quando o analiso no testador posso ver o indicador mudando visualmente, enquanto não há saída fora do filtro. Presumo que em algum lugar o valor do valor registrado "MA_otshet" seja perdido.
Boa tarde. Por favor, ajude.
Preciso que todas as ordens sejam fechadas às 23:55 e na sexta-feira as negociações terminam às 22:00, então há um problema com a negociação
encontrei no roteiro do tutorial na seção de tempo ajuda por favor adicione o número do parâmetro do dia, ou seja, os pedidos de sexta-feira foram fechados às 21 55 e nos dias normais às 23 55 ou pode compartilhar o link se houver soluções prontas
//--------------------------------------------------------------- 4 --
Calma!!!
Obrigado. Mas você tem uma pista. Preciso apenas de 1 dia de informação. Isto é, exibir as informações de lucro para o último dia útil
As variáveis são declaradas. Não funciona. É tudo zeros.
for (p=0; p<OrdersHistoryTotal(); p++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )
p0+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
double r0=p0*100/AccountBalance();
Obrigado. Mas, você pode me dar uma dica? Eu só preciso de 1 dia. Ou seja, para exibir as informações de lucro do último dia útil
As variáveis são declaradas. Não funciona. Tudo isso é nulo.
for (p=0; p<OrdersHistoryTotal(); p++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (StrToTime(TimeToStr(TimeCurrent(), TIME_DATE))<OrderCloseTime() && (OrderType()==OP_BUY || OrderType()==OP_SELL) )
p0+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
double r0=p0*100/AccountBalance();
O princípio não é difícil de entender. Para calcular o lucro/perda para o dia atual, é necessário passar o valor: fCalculate_Pribul (-2, iTime (Symbol(), PERIOD_D1, 0), "").
Boa tarde. Por favor, ajude.
Preciso que todas as ordens sejam fechadas às 23:55 e na sexta-feira as negociações terminam às 22:00, então há um problema com a negociação
encontrei no roteiro do tutorial na seção de tempo ajuda por favor adicione o número do parâmetro do dia, ou seja, os pedidos de sexta-feira foram fechados às 21 55 e nos dias normais às 23 55 ou pode compartilhar o link se houver soluções prontas
//--------------------------------------------------------------- 4 --
É claro que o código foi escrito no rascunho, mas ele deve funcionar, pelo menos você deve entendê-lo
Onde esta parte especifica a espessura da linha? Fiquei até envergonhado. :(