[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 228

 
//записать

void SaveArray(string File, double &a[])
{
    int h = FileOpen(File, FILE_BIN|FILE_WRITE);
    if(h>0)
    {
      int sz = ArraySize(a); 
      FileWriteArray(h,a,0,sz);
      FileClose(h);
    }
}

//прочитать

void OpenArray(string File, double &a[], int sz)
{
    int h = FileOpen(File, FILE_BIN|FILE_READ);
    if(h>0)
    {
      ArrayResize(a,sz);
      FileReadArray(h,a,0,sz);
      FileClose(h);
    }
}
 
Aqui está o anúncio
int Buy[];int Sell[];       string FileBuy="FileBuy.csv",FileSell="FileSell.csv";
 
paladin80:
Onde é o melhor lugar para declarar um tipo variável (int, double, etc.) em termos de redução do consumo de recursos da execução do programa. Por exemplo, int i pode ser declarado globalmente ou em int start() ... para (int i=OrdersTotal()-1; i>=0; i--) ... Tenho a sensação de que declarar em cada carrapato é mais caro do que declarar uma vez em nível global, logo após parâmetros externos. Ou existe a mesma diferença na intensidade dos recursos?

Todas as variáveis (locais de memória) são criadas uma vez no início do programa e devem então ser inicializadas onde ocorrem no texto(declaração de variável), mas isso nem sempre acontece, portanto, se você quiser que tudo funcione corretamente, não se esqueça de inicializá-lo explicitamente ao declarar.
 
Shurkin:

Corrigido o código para corresponder ao seu.
Ao testar, quatro pedidos foram fechados por ordem de ajuste no primeiro tick, o quinto fechou no tick seguinte. Provavelmente algo mais está errado aqui, já que eu testei repetidamente.
Estou lhes fornecendo o código do programa e os logs do testador.
Sinceramente. Shurkin

Está claro. Substitua

for(i=0, int k=0; i<OrdersTotal();i++,k++)//

para .

int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
 
Olá, você poderia me dizer como calcular a soma dos valores indicadores em cada bloco de histograma separado? Eu escrevi um indicador, mas ele só começa a funcionar quando é instalado. Em barras anteriores - nada! Eu não consigo pedalar "enquanto"! Ajuda, profissionais.

	          
 

Há a seguinte situação:

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for (int obj=0; obj<=ObjectsTotal()-1; obj++)
   {
      objName = ObjectName(obj);
      isObj = ObjectFind(objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName,0);
   }
   Print("objPriceCurr = ", objPriceCurr);
      
      if (isObj != -1)  // Если объект найден, значит выходим из функции
         return (true);
         
   return (false); // Объект не найден!
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

Mostrei um pedaço de código onde há um mal-entendido. Todas as variáveis são declaradas globais. Na funçãoIsObjectFound() obtenho os valores do primeiro e segundo pontos de preço do objeto, o nome e o valor do preço do objeto na barra atual. Se o objeto for encontrado, ele deve sair da função no modo verdadeiro, caso contrário em modofalso .

No início, prescrevi uma condição que se o objeto não for encontrado, então eu saio da função:

if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

Eu o testei, eu não desenhei nenhum objeto, não há nada - um gráfico nu. No entanto, a função não desiste e não é impressa em conformidade:

 Print("В окне отсуствуют объекты, поиск продолжается...");

A função de partida continua. De que se trata tudo isso?

 
Não é nada bom.
 
O que está errado?
 

Variáveis globais são buscas globais. O que você pode dizer sobre o algoritmo sem ver o modelo de dados?

Eu rastrearia exatamente os dados. E isObj realmente booleano, e tudo isso ...

 
tara:

Variáveis globais são buscas globais. O que você pode dizer sobre o algoritmo sem ver o modelo de dados?

Eu rastrearia exatamente os dados. E isObj realmente booleano, e tudo isso ...


//+-------------------------------------------------------------------------------------+
//|                                                TradingByLine.mq4                    |
//|                                                              hoz                    |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = "Параметры отклонений зоны сигнала";
extern double dernovich = 40,
              faustUs = 40;
/*extern double limitOverLine = 3,
              limitUnderLine = 20;*/

string objName;                                  // Имя объекта
int isObj;                                       // Возвращает окно, которому принадлежит
                                                 // ..наденнный объект, либо -1
double objPrice1,                                // Первая координата цены луча     
       objPrice2,                                // Вторая координата цены луча
       objPriceCurr;                             // Цена объекта на заданном баре
int pt;

#define SIGNAL_BUY         0                     // Сигнал на покупку
#define SIGNAL_SELL        1                     // Сигнал на продажу
#define SIGNAL_NO         -1                     // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   if(Digits == 2 || Digits == 4)
     pt = Point;
   if(Digits == 1 || Digits == 3 || Digits == 5)
     pt = Point*10;
   if(Digits == 6)
     pt = Point*100;
   if(Digits == 7)
     pt = Point*1000;

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сигнализатор касания о луч                                                          |
//+-------------------------------------------------------------------------------------+
bool AlertByTouching(int signal)
{
   double priceDevBefore,
          priceDevAfter;
   
   if (signal == SIGNAL_SELL)
   {
      priceDevAfter = objPriceCurr + faustUs * pt;
      priceDevBefore = objPriceCurr - dernovich * pt;

      if (Bid <= priceDevAfter && Bid >= priceDevBefore)
      {
         Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
         Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
         
         return (true);
      }
   }
   if (signal == SIGNAL_BUY)
   {
      priceDevAfter = objPriceCurr - faustUs * pt;
      priceDevBefore = objPriceCurr + dernovich * pt;
      Print("priceDevAfter = ", objPriceCurr - faustUs * pt);
      Print("priceDevBefore = ", objPriceCurr - faustUs * pt);
      Print("Ask >= priceDevAfter && Ask >= priceDevBefore ", Ask ," >= ", priceDevAfter ," && ", Ask ," >= ", priceDevBefore);
      if (Ask >= priceDevAfter && Ask >= priceDevBefore)
      {
         Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
         Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
         
         return (true);
      }
   }
   return (false);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool GetSignal()
{
   if (!IsObjectFound())
      return (SIGNAL_NO);
   if (objPrice1 > objPrice2)
      return (SIGNAL_BUY);
   if (objPrice1 < objPrice2)
      return (SIGNAL_SELL);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for (int obj=0; obj<=ObjectsTotal()-1; obj++)
   {
      objName = ObjectName(obj);
      isObj = ObjectFind(objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName,0);
   }
   Print("objPriceCurr = ", objPriceCurr);
      
      if (isObj != -1)  // Если объект найден, значит выходим из функции
         return (true);
         
   return (false); // Объект не найден
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }
   
   if (signal != SIGNAL_NO)
      if (!AlertByTouching(signal))
         return (0);
   
   Print("objPrice1 = ", objPrice1, ", objPrice2 = ", objPrice2);
  // Print("objPriceCurr = ", objPriceCurr);

  return (0);
}
isObj é um int. Retorna a janela que tem o objeto dentro dela, se houver. Se ela não existir, entendo que retornará -1. De acordo com o documento, a janela principal começa em 0 e depois as subjanelas. Até agora, este é um esboço para um Expert Advisor comercial, puro sinal. Mas ele emite mensagens sempre que quer.
Razão: