[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 1126

 
drknn:


O código está errado. Primeiro, se a função start() for do tipo int, ela deve retornar um valor inteiro. Você tem um retorno devolvido somente por condição. E se a condição não for cumprida, o que a função start() deve retornar ao terminal?

Além disso, você é muito complicado para verificar - melhor fazer o seguinte: criamos um contador de pedidos, aberto e fechado hoje. Se o número de pedidos fechados hoje é maior que zero, então você não negocia. Caso contrário, estamos autorizados a negociar.

mudou de int para void... não ajudou

Para ser honesto, eu realmente não entendo como fazer um contador de pedidos e ainda ser capaz de habilitar/desabilitar a opção one-time daily trade....

....think-think-think-think-think it'll try it like this

if(CalculateCurrentOrders(Symbol())==0 && Order==0)

{

CheckForOpen();

if(WaitForNewDay) {Ordens++;}

retornar;

}

Contador de reinicialização:

if(WaitForNewDay)CheckForNewDay();

cheque nulo para NewDay()

{

tm=iTime(Símbolo(),PERÍODO_D1,0);

se (bt!=tm) {bt=tm; Ordens=0;}

}

De qualquer forma, voltei ao que eu estava fugindo de ))))

 
dzhini:

mudou de int para void... não ajudou

Sinceramente, não entendo como fazer um contador de ordens e ainda ser capaz de habilitar/desabilitar a opção de um dia de negociação....

-------------

De qualquer forma, de volta ao que eu estava fugindo de ))))

//+------------------------------------------------------------------+
//|                                                            0.mq4 |
//|                                          Copyright © 2010, Drknn |
//|                                                    drknn@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Drknn"
#property link      "drknn@mail.ru"

// ---------- Пользовательские переменные ----------------------------
extern int      MAGIC=0;//У ордеров открытых вручную MAGIC=0

// ------------ Вспомогательные переменные --------------------------
string    ExpertName="0";// имя советника
string    SMB;
bool      DobroTorga;

//+------------------------------------------------------------------+
//|                  Блок инициализации                              |
//+------------------------------------------------------------------+
int init(){

  SMB=Symbol();
  return(0);
}
//+------------------------------------------------------------------+
//|                  Блок деинициализации                            |
//+------------------------------------------------------------------+
int deinit(){
        if (!IsTesting()){
    Comment("");
    Print("Советник деинициализирован (выключен совсем)");
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Старт работы советника                          |
//+------------------------------------------------------------------+
int start(){
  if(!IsTradeAllowed()){
    Comment("Торговля запрещена в настройках терминала, либо торговый поток занят");
    Print("Торговля запрещена в настройках терминала, либо торговый поток занят");
    return(0);
  }
  DobroTorga=true;
  if(SchBuy(MAGIC)+SchSell(MAGIC)+HistSchBuy(MAGIC)+HistSchSell(MAGIC)>0){
    DobroTorga=false;
  }
  if(DobroTorga==true){
    // ---- добро торговать есть - ставим ордера ---------
  }
  return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+


// =================================================================================================
// ************************* Счётчики ордеров ******************************************************
// =================================================================================================

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        SchSell++;
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================

//=========== HistSchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров сегодняшнего дня в истории
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int HistSchBuy(int MAGIC){
  int SchBuy=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchBuy++;
        }
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== HistSchSell()  ===============================
//  Функция возвращает количество Sell-ордеров сегодняшнего дня в истории
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int HistSchSell(int MAGIC){
  int SchSell=0;
  for (int i=OrdersHistoryTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
       Print("ОШибка № ",GetLastError()," при выборе ордера № ",i);
    }
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        if(OrderOpenTime()>=iTime(SMB,PERIOD_D1,0)){
          SchSell++;
        }
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================
 
Por favor, ajude-me com o código. Eu desenho e movo manualmente uma linha horizontal e quando o preço a toca, ela deve acionar um sinal.
 
Alexandr24:
Por favor, ajude-me com o código. Eu desenho e movo manualmente uma linha horizontal e quando o preço a toca, ela aciona um sinal.

O preço toca a linha - há um sinal. Eu entendo isso. O que há de errado com o código?
 
drknn:


Você está no comando hoje))) obrigado. Vou dar uma olhada
 
Desculpe, eu não defini a tarefa corretamente)) Eu preciso de um código que faça isso.
 
Alexandr24:
Desculpe, eu defini a tarefa de forma incorreta)). O que você precisa é de um código que faça isso.


A primeira coisa que você precisa entender é que uma linha é um objeto. O código de programação distingue os objetos por seus nomes. Você precisa escrever o nome da linha no código, e então quando você deixar cair a linha em um gráfico, você precisa entrar em suas propriedades e mudar o nome para aquele que você escreveu no código. Somente então o código entenderá que você precisa processar as leituras extraídas deste objeto.

A seguir, no código você precisa consultar o preço onde se encontra a linha. A solicitação é feita através da função ObjectGet(string name, int prop_id) dupla. Em vez de nome, você precisa especificar o nome de sua linha, e em vez de prop_id especificar OBJPROP_PRICE1. Desta forma, você pode programar o preço ao qual esta linha é definida. Então, no código, você precisa verificar se o preço toca esta linha. Por exemplo: Se o preço no tick anterior estiver abaixo do nível onde a linha está definida e for mais ou igual a este nível no tick atual, então este tick já ocorreu.

Alexander, se você não consegue fazer algo com o código, eles podem ajudá-lo. Se você precisa que o código seja implementado para você, por favor, acesse https://www.mql5.com/ru/job.

 
int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----

 double n=ObjectGet("n",OBJPROP_PRICE1); 
 if (Close[0]==n&&Close[0]!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }
Eu fiz isso, mas o sinal não funciona quando Close[0]==n. Como consertá-lo? As condições são cumpridas, mas por alguma razão não funciona.
 
Alexandr24:
Já o fiz, mas o sinal não funciona quando Close[0]==n. Como consertá-lo?


Bem, a julgar pelo código, você fez um indicador. Portanto, para verificar se esta parte do código funciona, você terá que sentar-se e esperar que o próximo tique toque a linha. É melhor criar um roteiro para testar esta parte do código, pois ele lhe dará resultados imediatos.

A primeira coisa que você precisa ter certeza é que o código realmente vê sua linha. Como você faz isso? Você precisa pedir seu preço e exibi-lo como um alerta. Fazendo isso.

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
  string LineName="1";
  double MyLine=-100;
  MyLine=ObjectGet(LineName,OBJPROP_PRICE1);
  if(MyLine>0){
    Alert ("Горизонтальная линия ",LineName," установлена на уровень = ",MyLine);
  }
  else{
    Alert("Запрос значения линии ",LineName," вренул ошибку № ",GetLastError());
  }
  return(0);
}
//+------------------------------------------------------------------+

Agora que o roteiro foi recompilado, abrimos qualquer gráfico e desenhamos uma linha horizontal sobre ele. Em seguida, inserimos suas propriedades e, como demos "1" nome à linha no código, definimos este nome também nas propriedades da linha:

Clique OK. Deixamos cair o roteiro no gráfico e nos certificamos de que o alerta tenha devolvido o preço correto. Movemos a linha no gráfico para outro lugar e novamente jogamos o script de volta no gráfico e nos certificamos de que se mudarmos a posição da linha manualmente, o código ainda a vê e reconhece.

Procedemos da mesma forma.

 

O indicador é testado através do testador com a visualização ligada. Eu corrigi um pouco o código, porque para que o alerta seja acionado, os valores devem ser normalizados. Mas se você mover a linha na barra atual, digamos uma hora, então o alerta será acionado apenas 1 vez com o movimento subseqüente da linha na barra atual de alerta por algum motivo que não funciona. Tenho que esperar por outro bar.

int start()
  {
   int   i, counted_bars=IndicatorCounted();
//----
double b=NormalizeDouble((Close[0]),Digits);
 double n=NormalizeDouble(ObjectGet("n",OBJPROP_PRICE1),Digits); 
 if (b==n&&b!= 0)
 Alert(Symbol(),"  n  ",n);

//----
Comment(n);
   return(0);
  }