Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 360

 
gyfto:

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(){
   static int a = 12;
   return;
}

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.

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red 
//--- input parameters
//--- buffers
double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(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;
   static double MA_otshet;  //здесь хранится запись значения MA_otshet
   
   for(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_otshet

      if(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);
  }
//+------------------------------------------------------------------+
 

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

//--------------------------------------------------------------------
// timeevents.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
extern double Time_Cls=16.10;          // Время закрытия ордеров
bool Flag_Time=false;                  // Флаг, сообщения ещё не было 
//--------------------------------------------------------------- 2 --
int start()                            // Спец. функция start
  {
   int    Cur_Hour=Hour();             // Серверное время в часах
   double Cur_Min =Minute();           // Серверное время в минутах
   double Cur_time=Cur_Hour + Cur_Min100; // Текущее время
   Alert(Cur_time);
   if (Cur_time>=Time_Cls)             // Если наступило время события
      Executor();                      //.. то выполняем задуманное
   return;                             // Выход из start()
  }
//--------------------------------------------------------------- 3 --
int Executor()                         // Пользовательская функция
  {
   if (Flag_Time==false)               // Если ещё не было сообщения..
     {                                 // .. то сообщаем (1 раз)
      Alert("Время важных новостей. Закройте ордера.");
      Flag_Time=true;                  // Теперь сообщение уже было
     }
   return;                             // Выход из польз. функции
  }

//--------------------------------------------------------------- 4 --

 
r772ra:
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();

 
Zolotai:


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), "").
 
sannin:

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

int start() {
switch(DayOfWeek()){// если пятница,суббота, и т.д.
 case 4://пятница
 case 5://суббота на всякий случай
 case 6://воскресенье на всякий случай
             if((Hour()==22 && Minute()>=00) || Hour()>22){
                 //   Выполняем какое то действие  в пятницу после 22:00
             }
             break;
 case 0://понедельник
 case 1://вторник
 case 2://среда
 case 3://четверг
             if(Hour()>23 || (Hour()==23 && Minute()>55)){
                // все остальные действия в нормальные рабочии дни ПОСЛЕ 23:55
             }
              break;
  default:   {//все остальные действия в нормальные рабочии дни до 23:55
  
             }
 }                   
}
 
SetIndexStyle(1,DRAW_LINE,STYLE_DASH,0);
Onde esta parte especifica a espessura da linha? Fiquei até envergonhado. :(
 
Link_x:
Onde esta parte especifica a espessura da linha? Fiquei até envergonhado. :(
O último parâmetro.