[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 774

 
drknn:

Não entendo o que tenho uma linha na abertura da ordem de mercado, copio-a e adiciono uma nova à ordem, mas o mesmo erro 4107 não aparece no registro, mas a ordem abre, se você se importa em olhar o que eu perdi

Arquivos anexados:
test_21_1.mq4  15 kb
 
FoxUA:

Não entendo, tenho esta linha na abertura da ordem de mercado, copio-a em uma ordem pendente e adiciono uma nova, mas o mesmo erro 4107 ainda escreve no registro, mas as ordens pendentes são colocadas, se você se importa em ver o que eu perdi.


Você tem um maldito código mal organizado. E os nomes das variáveis têm abreviações que também dificultam a sua leitura.

O código deve ser organizado em blocos. Atribuir nomes às variáveis de tal forma que fique claro, num relance, de que se trata o código. Nomes constantes (entre no hábito) escreva-os em letras maiúsculas. A inicialização de constantes com valores deve ser colocada em um bloco de inicialização. Assim, por exemplo, você tem um uso absolutamente injustificado da corda

string sy = Símbolo();

no início da EA. Bem, diga-me por que a cada tique, por que você precisa chamar a função Symbol(), se durante todo o comércio o nome do símbolo permanece o mesmo? É suficiente inicializar uma vez com valor de sy variável em bloco de inicialização, e isso é tudo. Além disso, este bloco de código

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

É fundamentalmente errado! Para descobrir a parada de perda da última ordem, ela (a ordem) deve primeiro ser selecionada usando OrderSelect() - veja o exemplo no contador de ordens abaixo. Isto significa que se você precisar de níveis de parada para as últimas ordens, você precisará fazer isto através de um loop. A seguir. O projeto de

int total = OrdersTotal();
if(total == 0){

}

não se justifica. Função OrdensTotal() retornará o número total de ordens já abertas no terminal. Este valor inclui ordens abertas por outros instrumentos de negociação, bem como ordens que não foram abertas pelo Expert Advisor, mas por você pessoalmente para o mesmo instrumento, que o Expert Advisor colocou.

Se você não vai trocar à mão e apenas trocar o símbolo ao qual a EA foi lançada, então este projeto vai funcionar. Mas assim que você quiser negociar com suas mãos e a EA não interferir em suas negociações manuais, ou quiser que as negociações sejam executadas com outros símbolos também, o projeto realmente o decepcionará. Portanto, é melhor escrever contadores de pedidos separados para cada tipo de pedido. Aqui está um exemplo de um contador desse tipo.

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  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);
}                  

Reescreva o código levando em conta as recomendações acima!!!

 

Desculpe, eu não percebi que as cordas como

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT

chamar um subprograma.

Mas ainda é melhor organizá-lo de uma maneira diferente.

>> duplo StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Você não precisa passar um nome simbólico de um símbolo comercial para o subprograma. Sua sub-rotina está no Expert Advisor, não na biblioteca incluída. Como a variável sy é declarada a nível global do Expert Advisor, esta variável está no escopo de tais subprogramas. Além disso, você passa o segundo parâmetro para o subprograma, mas quando você chama o próprio subprograma, você inicializa este parâmetro com um valor ( int op=-1) - você não precisa fazer isto. O mesmo é válido para o parâmetro seguinte.

A linha

>> se (op<0 || OrderType()==op) {

novamente é ilegível. Veja como está organizado no meu balcão!

 

E depois há isto. O bloco de código

pral=StopLossLastPos(sy,OP_BUY,-1) ;   // цена по StopLoss последнего открытого BUY на покупку BUYLIMIT
pras=TakeProfitLastPos(sy,OP_BUY,-1);  // цена по TakeProfit последнего открытого BUY на покупку BUYSTOP
prbl=StopLossLastPos(sy,OP_SELL,-1);   // цена по StopLoss последнего открытого SELL на продажу SELLLIMIT
prbs=TakeProfitLastPos(sy,OP_SELL,-1) ;// цена по TakeProfit последнего открытого SELL на продажу SELLSTOP

é chamado a cada tique. Mas não é necessário em cada carrapato. Você só precisa conhecer a ordem de parada/lucro em alguns casos. Estes são os casos em que você precisa chamar sua subrotina.

 
spidey:

Olá, você pode anexar um alerta ao indicador (o verde cruza o vermelho de cima para baixo - vender, voltar - comprar)?

Bem, alguém está postando códigos roubados no fórum novamente. :))))))))

Duvido que alguém queira escavar esta mistura de variáveis numeradas gratuitamente :)

 
spidey:

Boa tarde, poderia acrescentar um alerta ao peru (o verde cruza o vermelho de cima para baixo - vender, voltar - comprar)?

Se você fizer isso novamente, serei obrigado a bani-lo do jogo.

Isto é uma violação das regras do fórum.

 
o código deve ser afixado?
 
drknn:

Desculpe, eu não percebi que as cordas como

chamar um subprograma.

Mas ainda é melhor organizá-lo de uma maneira diferente.

>> duplo StopLossLastPos(string sy="", int op=-1, int mn=-1) {

Você não precisa passar um nome simbólico de um símbolo comercial para o subprograma. Seu subprograma está no Expert Advisor, não na biblioteca incluída. Como a variável sy é declarada a nível global do Expert Advisor, esta variável está no escopo de tais subprogramas. Além disso, você passa o segundo parâmetro para o subprograma, mas quando você chama o próprio subprograma, você inicializa este parâmetro com um valor ( int op=-1) - você não precisa fazer isto. O mesmo é válido para o parâmetro seguinte.

A linha

>> se (op<0 || OrderType()==op) {

novamente é ilegível. Veja como está organizado no meu balcão!

Portanto, acho que a chamada de função pode ser escrita de forma simples

PrAskLim = StopLossLastPos(OP_SELL); na própria função

duplo StopLossLastPos(int op=-1,) como este?

Já lhe disse que tirei as funções deste site, seu trabalho foi testado porque não ouso mudar suas variáveis por outras mais legíveis, porque posso não ter experiência no que você pode e no que você não pode mudar; isto está repleto do perigo de que eu possa mudar algo errado em uma função de trabalho e você vai agulhar em uma pilha de código de novo,

mas consertei o máximo possível o que pude acrescentar,

Eu mesmo já o acrescentei, mas não resolvi meus problemas com o log 4107 e tenho uma dúvida sobre como fixar o preço e parar porque não mudei nada fundamentalmente na função de pedidos pendentes.

A segunda questão é como adicionar um spread a este preço PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )

Aqui está a versão modificada do EA

Arquivos anexados:
test_21_2.mq4  16 kb
 
spidey:
o código deve ser afixado?
Você não precisa afixar as coisas roubadas.
 
drknn:
Você não tem que postar coisas roubadas.

Não é preciso roubar.

E as regras deste recurso não o proíbem...

https://www.mql5.com/ru/code/8089

;)