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 869

 
Top2n:

Desculpe, é uma pena passar por cima da mesma coisa cem vezes.

Estou olhando como uma ovelha para o portão há quase um mês. Eu não entendo nada.

A tarefa é calcular uma média móvel menor, com uma média móvel de 13,

ou seja, para calcular um período de 12 com base em 13.

Fácil de calcular: Y(N)=1/N*(Y(N+1)*(N+1)-X[N]), onde Y(i) - valor de MA(i) na barra zero, X[j] - valor do preço na barra j; somente isto é um absurdo computacional, enquanto não permite olhar para o futuro de qualquer forma.
 

Olá! Um dos estimados gurus gostaria de verificar o início da minha primeira EA? É possível seguir em frente? Talvez eu tenha perdido alguma coisa? Eu ficaria muito grato por qualquer especificação. Vi em algum lugar no fórum como abrir apenas uma posição, mas não a copiei e agora não consigo encontrá-la. Ajude, por favor.

Obrigado!

// Versão de teste do Expert Advisor

//--------------------------------------------------------------------

//------Вводные данные:-----------------------------------------------------------

entrada duplo Lotes = 0,1; //Lote

input int MovingPeriod =5; // МА período de cálculo

input int MovingShift =0; // MA shift

input int Período InpBandsPeriod=10; // Período Bollinger Bands

input int InpBandsShift=0; // Mudança de banda de Bollinger

inputBandDeviations=2.0; // Desvio das Bandas de Bollinger

entrada no período K_Period=30; // %K período do estocástico

input int D_Period=10; // %D Período estocástico

input int Slowdawn =8; // Atraso estocástico

cor de entrada clMainStoch =Yellow; // cor da linha Stochastic principal

cor de entrada clSignalStoch =Red; // cor da linha de sinal estocástico

// -----Declare Global Variables:------------------------------------------

duplo MA_0, MA_1, MA_2; // valor MA em 0, 1 e 2 barras

duplo MB_0, MB_1, MB_2; // Valor do Bollinger médio em 0, 1 e 2 barras

duplo ExtUpperBuffer[]; // valor da linha superior do Bollinger

duplo ExtLowerBuffer[]; // Valor da linha inferior do Bollinger

duplo Delta_0, Delta_1; // diferença entre os valores de Bollinger superior e inferior ...

// ...Linhas de Bollinger em 0 e 1 barras

duplo Yellow_0, Yellow_1, Yellow_2; // valor PRINCIPAL em 0, 1 e 2 barras

duplo vermelho_0, vermelho_1, vermelho_2; // valor SIGNAL em 0, 1 e 2 barras

//-------Поехали!----------------------------------------------------------------

int start() //Special function start

{

//função chamada do indicador MA

MA_0=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

MA_1=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,1);

MA_2=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,2);

//feedback para a função Bollinger Bands

MB_0=iBand(NULL,0,InpBandPeriod,InpBandShift,InpBandDeviations,PRICE_CLOSE,0);

MB_1=iBand(NULL,0,InpBandPeriod,InpBandShift,InpBandDeviations,PRICE_CLOSE,1);

MB_2=iBand(NULL,0,InpBandPeriod,InpBandShift,InpBandDeviations,PRICE_CLOSE,2);

Delta_0=iBands(ExtUpperBuffer[0]-ExtLowerBuffer[0]));

Delta_1=iBands(ExtUpperBuffer[1]-ExtLowerBuffer[1]));

//Stochastic function call

Yellow_0=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,0)

Yellow_1=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,1);

Yellow_2=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_MAIN,2);

Red_0=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,0)

Red_1=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,1);

Red_2=iStochastic(NULL,0,K_Period,D_Period,Slowdawn,MODE_SMA,0,MODE_SIGNAL,2);

//-------Ситуации по Стохастику:-----------------------------------------------------

// O mercado está sobre-comprado

duplo MOB()=(Yellow_0>=80 && Red_0>=80); // Variável local

// O mercado está sobre-vendido.

duplo MOS()=(Yellow_0<==20 && Red_0<==20); // Variável local

// O mercado é normal.

double MN()=(20<Yellow_0<80 && 20<Red_0<80); // Variável local

// situação crítica

double MC1()=(20<Yellow_0<80 && Red_0<==20); // Variável local

double MC2()=(20<Yellow_0<80 && Red_0>=80); // Variável local

double MC3()=(20<Red_0<80 && Yellow_0<==20); // Variável local

double MC4()=(20<Red_0<80 && Yellow_0>=80); // Variável local

//-------Example(my)order to open position-----------------------------------------------------


se (Delta_0 > Delta_1 && MOB()==verdadeiro) //O mercado está sobre-comprado mas o delta está em expansão

{ if (MB_2 > MB_1 && MB_1 < MB_0) //Lower Bollinger Break

PedidoEnviar(Símbolo(),OP_BUY,Lotes,Pedir,0,Bid-1500*Point,Bid+1500*Point);//abrir pedido de compra

Alerta("GetLastError()); //Mensagem de um erro

Alerta("Posição aberta BAY com lotes("Lotes"),preço("Perguntar")"); // Mensagem de compra

 

Além disso, as posições BAY (assim como Sell) podem ser abertas sob diferentes condições e, dependendo das condições sob as quais a posição foi aberta (por exemplo, BAY), haverá diferentes condições de fechamento. (por exemplo, BAY), haverá diferentes condições de fechamento.

Como faço para traduzir isto em MKL?

 
rapid_minus:

Além disso, as posições BAY (assim como Sell) podem ser abertas sob diferentes condições e, dependendo das condições sob as quais a posição foi aberta (por exemplo, BAY), haverá diferentes condições de fechamento. (por exemplo, BAY), haverá diferentes condições de fechamento.

Como faço para traduzir isto em MKL?

Selecionamos a ordem no laço. Se for uma compra, e outros dados (símbolo, magik, etc.) atenderem ao critério de que deve ser fechada em "condições de fechamento personalizadas", então a fecharemos se existirem "condições de fechamento personalizadas".
 
artmedia70:
Selecionamos a ordem no laço. Se for uma compra e todos os outros dados (símbolo, mágico, o que quer que seja) atenderem ao critério de ter que fechá-la em "condições de fechamento adequadas", então a fechamos se houver "condições de fechamento adequadas".

É um pouco vago para mim, mas depois de algumas escavações, acho que vou entender. Muito obrigado por não se afastar ou dar lições dos picos de conhecimento, como alguns camaradas da União Soviética.

Eu descobri como fechar:

//-------Exemplo(meu) de uma ordem para abrir uma posição com um fechamento vinculante (por bilhete)-----------------------------------------------------

// Variável local que abre uma ordem BAY (ao invés da linha 63)

int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point))

//-------Então, o fechamento para esta ordem específica poderia ser o seguinte: -----------------------------------------------------

se (Ticket_1()==verdadeiro) //se a ordem #1 foi aberta, então...

{ if (Yellow_0>Red_0 && (Yellow_0-Red_0)<(Yellow_1-Red_1)) //Yellow is higher than red, contraction(condition)

{ se (MA_2 < MA_1 && MA_1 > MA_0);} //Red acima da do meio(condição)

else (Yellow_0>Red_0 && (Yellow_0-Red_0)>(Yellow_1-Red_1)) //Yellow above red, expansão(condição)

{ if (MB_2 < MB_1 && MB_1 > MB_0);} / /Partida superior do Bollinger (condição)

bool Ans=OrderClose(Ticket,Lot,Bid,0); //...fechar ordem (lockvariável)

Alerta("Tentativa de fechar o pedido com Bid("Lots"),preço("Ask"). À espera de resposta...");

se (Ans===verdadeiro) // Funcionou :)

{

Alerta ("Pedido BAY fechado por lote ("Lotes"), Preço de fechamento ("Licitação");

pausa; // Sair do laço de fechamento da posição

}


}

Por favor, faça uma análise, bem no post anterior também. Desculpe por ser teimoso, mas veja - você é o único que responde... Obrigado!

 
//-------Пример(мой) приказа на открытие позиции с привязкой закрытия (по тикету)----------------------------------------------------- 
                                                      
                                                      //Локальная переменная, открывающая ордер БАЙ(вместо строки 63)
   int Ticket_1() = (OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-1500*Point,Bid+1500*Point));
   
        //-------Тогда закрытие именно для этого приказа может быть таким:-----------------------------------------------------
    
    if (Ticket_1()==true)                              //Если был открыт ордер №1, то...
     { if (Yellow_0>Red_0 && (Yellow_0-Red_0)<(Yellow_1-Red_1)) //Желтая выше красной, сужение(условие)
        { if (MA_2 < MA_1 && MA_1 > MA_0);}                      //Верхний перелом Средней (условие)
       else (Yellow_0>Red_0 && (Yellow_0-Red_0)>(Yellow_1-Red_1)) //Желтая выше красной, расширение(альтерн.условие)
         { if (MB_2 < MB_1 && MB_1 > MB_0);}                      //Верхний перелом Боллинджера (условие)
       
       bool Ans=OrderClose(Ticket,Lot,Bid,0);          //...закрытие ордера (лок.переменная)                                               
   Alert("Попытка закрыть ордер БАЙ лотом("Lots"),цена("Ask"). Ожидание ответа..");
   if (Ans==true)                                     // Получилось :)
        {
         Alert ("Закрыт ордер БАЙ лотом("Lots"),цена закрытия("Bid");
         break;                                       // Выход из цикла закрытия позиции
        }

     }
É muito mais fácil de ler. Desculpe.
 
rapid_minus:

É um pouco vago para mim, mas depois de algumas escavações, acho que vou entender. Muito obrigado por não virar as costas e dar lições do alto do conhecimento, como alguns camaradas do país soviético.

Pensei em fechá-lo desta forma:

...

Por favor, faça uma análise, e no post anterior também. Desculpe a insistência, mas veja, você é o único que responde... Obrigado!

Bem, é um pouco obscuro, não é?

1. você tem que determinar o fato da ocorrência da condição para fechar o pedido

2. No ciclo, você revisa todas as posições em aberto e, quando encontrar a ordem de compra necessária, você a fecha.

Este é um exemplo de um ciclo:

void ClosePositions(string symbol, int type, int magic) {
   for(int i=OrdersTotal()-1; i>=0; i--) {      // цикл по открытым ордерам
      if(OrderSelect(i,SELECT_BY_POS)) {        // выбираем ордер по индексу
         if(OrderMagicNumber()!=magic) continue;// если магик не искомый - ищем дальше
         if(OrderSymbol()!=symbol)     continue;// если символ не тот - ищем дальше
         if(OrderType()!=type)         continue;// если тип ордера не тот - ищем дальше
         // здесь, если ордер выбран, то он соответствует нужным критериям,
         // вызов функции закрытия выбранного ордера по тикету
         }
      }   
   }

Ou seja, para fechar o pedido de compra no símbolo atual (no gráfico onde o Expert Advisor está funcionando) e com um número mágico de 100500 (por exemplo), você deve chamar a função desta forma

ClosePositions(Symbol(),OP_BUY,100500);

Você não precisa escrever o número 100500, geralmente o número mágico já está definido na EA para uma variável, por exemplo int Magic = 100500; então você precisa escrever Magic ao invés de 100500

Eu não escrevi nada no laço onde a posição selecionada deveria ser fechada, pois deveria chamar a função para fechar a ordem de acordo com o bilhete. Geralmente é uma chamada de uma função completa com códigos de retorno do servidor comercial tratado. Você pode escrever ali um simples comando para fechar a ordem selecionada OrderClose() para verificar;

 
rapid_minus:
É muito mais fácil de ler dessa maneira. Desculpe.

Também é possível editar um posto antigo, para não criar duplicatas ;)

 
evillive:
Ainda é possível editar um posto antigo para evitar duplicatas ;)
Tentei, mas o SRC não o coloca mais.
 
artmedia70:

Está um pouco enevoado.

1) Determinar o fato de que a condição para fechar a ordem de compra tenha ocorrido

2. No loop, você revisa todas as posições em aberto e, quando encontrar a ordem de compra necessária, você a fecha.

Este é um exemplo de um ciclo:

Ou seja, para fechar o pedido de compra no símbolo atual (no gráfico onde o Expert Advisor está funcionando) e com um número mágico de 100500 (por exemplo), você deve chamar a função desta forma

Você não precisa escrever o número 100500, geralmente o número mágico já está definido na EA para uma variável, por exemplo int Magic = 100500; então você precisa escrever Magic ao invés de 100500

Eu não escrevi nada no laço onde a posição selecionada deveria ser fechada, pois deveria chamar a função para fechar a ordem de acordo com o bilhete. Geralmente é uma chamada de uma função completa com códigos de retorno do servidor comercial tratado. Você pode escrever ali um simples comando para fechar a ordem selecionada OrderClose() para verificar;


Obrigado. Mas, tanto quanto entendi, o magik é atribuído automaticamente ao abrir um pedido. É por isso que não posso determinar em quais condições o pedido é aberto e, portanto, não conheço as condições para fechá-lo.