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 446

 

Querida, preciso de ajuda.

Tomei o código para contabilidade, abertura e fechamento de ordens do tutorial (tradingexpert.mq4). O código é destinado a trabalhar com uma posição. Preciso ter cinco posições.

Modificamos ligeiramente o código da seguinte maneira (alteramos as linhas em negrito), para que as posições sejam abertas na quantidade certa, mas quando invertemos, apenas uma posição é fechada e a posição invertida é aberta imediatamente.

Como posso fazer para que todas as posições sejam fechadas na inversão e depois apenas a posição oposta seja aberta?

   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>5)                           // Было не более одного орд, стало не более пяти
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total < 5 && Opn_B==true)     // Открытых орд. нет +. Было Total < 1, стало Total < 5
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
   // Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy
         if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Buy ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
 
Forexman77:

Querida, preciso de ajuda.

Tomei o código para contabilidade, abertura e fechamento de ordens do tutorial (tradingexpert.mq4). O código é destinado a trabalhar com uma posição. Preciso ter cinco posições.

Modificamos ligeiramente o código da seguinte forma (alteramos as linhas em negrito), para que as posições sejam abertas na quantidade certa, mas quando invertemos, apenas uma posição é fechada e a posição invertida é aberta imediatamente.

Como posso fazer para que todas as posições sejam fechadas na inversão e depois apenas a posição oposta seja aberta?


Faça do Ticket uma matriz Ticket[5], armazene todos os 5 tickets nele. Ao fechar, percorrer todas as passagens de acordo.
 
Vinin:

Você não pode ser considerado um iniciante pelo nível de utilização das bibliotecas. Tendo analisado seu código, levaria duas semanas para descobri-lo. Se não mais. Portanto, acho que você não terá uma resposta.
Vitya, não há necessidade de entender nada - o homem quer tornar as variáveis globais de uma "caixa de areia" (EA com suas bibliotecas) visíveis na outra "caixa de areia" (biblioteca compilada). :)))
 

Não sou um progamador, sou um construtor de códigos. Por isso, construí este indicador (vejo que você pode fazer uma exposição de texto, não um arquivo t - isso é o que farei para facilitar a compreensão.

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 2);
SetIndexBuffer(0,Buffer);
return(0);
}
// -------------------------------------------------------------------

int deinit()
{
return(0);
}
//--------------------------------------------------------------------

int start()
{
int StartBar = Bars - IndicatorCounted() - 1;
for(int i = StartBar; i >= 0; i--)
{
if(TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1]))
Buffer[i] = 0;
else
Buffer[i] = Buffer[i+1];
if(Close[i]>Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее и преддыдущее движение растут
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее и преддыдущее движение падают
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]>Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее лвижение растет а предыдущее падает
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее движение падает а предыдущее растет
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
}
return(0);
}
//--------------------------------------------------------------------

Mostra a soma de pontos e a dinâmica de sua soma durante a semana - em prazos menores, se o movimento anterior continuar de Close[i+2] para Close[i+1] o movimento atual Close[i] é adicionado, se contra - é subtraído. Eu deveria prescrevê-lo para que o programa veja a sexta-feira fechada - em vez de fechar o bar -. Sei que pode ser feito com DayOfWeek e 5 (número de sexta-feira), mas como posso fazer isso na prática? Ajuda.

 
TarasBY:
Vitya, nada precisa ser resolvido aqui - a pessoa quer que as variáveis globais de uma caixa de areia (EA com suas bibliotecas) sejam visíveis em outra caixa de areia (biblioteca compilada). :)))

Igor, um pouco errado! Na "caixa de areia" (biblioteca compilada) somente as funções e todas as variáveis são declaradas no inluder. E as variáveis que são declaradas na inluder (incluir arquivo) devem ser visíveis na coruja, porque eu inseri a inluder diretamente na coruja. Você não está de acordo?
 
Vitek2010:

Não sou um progamador, sou um construtor de códigos. Por isso, construí este indicador (vejo que você pode fazer uma exposição de texto, não um arquivo t - isso é o que farei para facilitar a compreensão.

Mostra a soma de pontos e a dinâmica de sua soma durante a semana - em prazos menores, se o movimento anterior continuar de Close[i+2] para Close[i+1] o movimento atual Close[i] é adicionado, se contra - é subtraído. Eu deveria prescrevê-lo para que o programa veja a sexta-feira fechada - em vez de fechar o bar -. Sei que pode ser feito com DayOfWeek e 5 (número de sexta-feira), mas como fazer isso praticamente? Ajuda.


Será que vai servir?

//+------------------------------------------------------------------+
//|                                                    Vitek2010.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
  {
   SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,2);
   SetIndexBuffer(0,Buffer);
   return(0);
  }
// -------------------------------------------------------------------

int deinit()
  {
   return(0);
  }
//--------------------------------------------------------------------

int start()
  {
   int StartBar=Bars-IndicatorCounted()-1;
   if (StartBar>1) StartBar--;
   
   for(int i=StartBar; i>=0; i--)
     {
      Buffer[i]=Buffer[i+1];
      int pos0=iBarShift(NULL, PERIOD_W1, Time[i]);
      int pos1=iBarShift(NULL, PERIOD_W1, Time[i+1]);
      if (pos0==pos1) 
         Buffer[i]+=MathAbs(Close[i]-Close[i+1]);
      else 
         Buffer[i]=MathAbs(Close[i]-Close[i+1]);
     }
   return(0);
  }
//--------------------------------------------------------------------
 
hoz:

Igor, um pouco errado! Somente as funções estão na caixa de areia (biblioteca compilada), e todas as variáveis são declaradas no inluder. E as variáveis que são declaradas na inluder (incluir arquivo) devem ser visíveis na coruja, porque eu inseri a inluder diretamente na coruja. Você não concorda?
então o que a referência à biblioteca compilada tem a ver com ela?
 
Vinin:


Está tudo bem?

Não, não explica. Vou explicar - seu fórum é como uma esperança para o último reduto competente de prog. e inserção de tamanho - é assim que a redação PERÍODO_W1 o vê, mas nem o uso de tamanho nem o uso de pontos de referência fixos como datas obtêm qualquer efeito desejado. Eu postei uma pergunta específica sobre sexta-feira - a propósito seu código não compila porque diz 'versão' - propriedade desconhecida, então se você não sabe como colocar DayOfWeek e 5 (número de sexta-feira) no código, outras opções não ajudarão .
 
Vitek2010:
Não, não explica. Vou explicar - seu fórum é como uma esperança para o último reduto competente de prog. e inserção de tamanho - é assim que a redação PERÍODO_W1 o vê, mas nem o uso de tamanho nem o uso de dados fixos como datas obtêm qualquer efeito desejado. Eu postei uma pergunta específica sobre sexta-feira - a propósito seu código não compila porque diz 'versão' - propriedade desconhecida, então se você não sabe como colocar DayOfWeek e 5 (número de sexta-feira) no código, outras opções não ajudarão .

TimeDayOfWeek(Time[i]) não especifica o Tempo[i] mas uma data específica no formato D'2014.01.27'.

E se você precisar determinar que dia é hoje, basta ligar para DayOfWeek().

 
evillive:

Em TimeDayOfWeek(Time[i]) você não define a hora[i] mas uma data específica no formato D'2014.01.27'.

Se você quiser determinar que dia é hoje, basta ligar para DayOfWeek().

Onde você leu sobre a TimeDayOfWeek () (no exemplo)? :)))