[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 10

 
tol64:
Você pode aconselhar se é possível determinar programmaticamente a possibilidade de estabelecer um stop loss/stake profit imediatamente na abertura/estabelecimento de uma ordem pendente ou posteriormente?


Verifique previamente os níveis de parada e lucro.

Os identificadores de solicitação utilizados na função MarketInfo(). Pode ser um dos seguintes valores:

Constante . Valor Descrição
MODE_LOW 1 Preço mínimo diário
MODE_ELEVADO 2 Preço máximo diário
MODE_TIME 5 Hora da última citação
MODE_BID 9 Preço da última oferta recebida. Para o instrumento atual, ele é armazenado na variável predefinida Bid
MODE_ASK 10 Preço da última oferta recebida. Armazenado na variável predefinida Pedir o símbolo atual
MODE_POINT 11 Tamanho do ponto na moeda de cotação. Armazenado na variável pré-definida Ponto para o símbolo atual
MODE_DIGITOS 12 Número de dígitos após o ponto decimal no preço do instrumento. Armazenado na variável pré-definida Dígitos para o símbolo atual
MODE_SPREAD 13 Espalhado em pips
MODE_STOPLEVEL 14 Nível mínimo permitido de Stop Loss/Stake Profit em pips
MODE_LOTSIZE 15 Tamanho do contrato na moeda base do instrumento
MODE_TICKVALUE 16 Tamanho mínimo de mudança no preço do instrumento na moeda do depósito
MODE_TICKSIZE 17 Etapa mínima de mudança do preço do instrumento na moeda de cotação
MODE_SWAPLONG 18 Troca de tamanho para posições longas
MODE_SWAPSHORT 19 Troca de tamanho para posições curtas
MODE_STARTING 20 Data de início do calendário (geralmente usado para futuros)
MODE_EXPIRATION 21 Data de expiração (normalmente usada para futuros)
MODE_TRADEALLOWED 22 Permissão para negociar o instrumento especificado
MODE_MINLOT 23 Tamanho mínimo do lote
MODE_LOTSTEP 24 Etapa da mudança de tamanho do lote
MODE_MAXLOT 25 Tamanho máximo do lote
MODE_SWAPTYPE 26 Método de cálculo de trocas. 0 - em pontos; 1 - na moeda base do instrumento; 2 - em porcentagens; 3 - na moeda margem.
MODE_PROFITCALCMODE 27 Modo de cálculo do lucro. 0 - Forex; 1 - CFD; 2 - Futuros
MODE_MARGINCALCMODE 28 Modo de cálculo da margem. 0 - Forex; 1 - CFD; 2 - Futuros; 3 - Índices CFD
MODE_MARGININIT 29 Exigência de margem inicial para 1 lote
MODE_MARGINMAINTENANCE 30 Quantidade de margem necessária para suportar posições em aberto por 1 lote
MODE_MARGINHEDGED 31 Margem cobrada em posições sobrepostas por 1 lote
MODE_MARGINREQUIRED 32 Quantidade de fundos gratuitos, necessários para abrir 1 lote para compra
MODE_FREEZELEVEL 33 Nível de congelamento dos pedidos em pontos. Se o preço de execução estiver dentro dos limites definidos pelo nível de congelamento, a ordem não pode ser modificada, cancelada ou fechada.

 
SeALALex:

Estou apenas aprendendo como escrever um EA, como muitos dos meus primeiros EAs sobre indicadores padrão, acabei de escrever um novo, mas agora compliquei minha tarefa. Em geral, como fazer, que no surgimento de condições abrisse uma posição e ao fechá-la, tomemos as mesmas condições ao salvar a nova não abriu, e abriu somente quando as condições opostas, etc. Obrigado!!!


há um exemplo pronto na ajuda

int i,accTotal=OrdersHistoryTotal(); for(i=0;i<accTotal;i++) { //---- verificar resultado da seleção se(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==falso) { Print("Error accessing historical database (",GetLastError(),")); break;
       } Precisamos lembrar o tempo de fechamento do pedido, comparar o tempo de fechamento do pedido com o tempo de fechamento na iteração anterior, se (o tempo de fechamento é maior e o tipo de operação comercial é Compra ou Venda), então devemos lembrar o tempo da ordem atual e tipo de operação comercial // como resultado, ao final do ciclo sabemos o tipo de ordem que fechou por último } Algo parecido com isto .

 
ivandurak:


Parada de pré-verificação e níveis de definição de lucro .


Não há verificação nesta lista para certos tipos de conta. Aqui está um parágrafo do Regulamento de Operações Comerciais para contas NDD:

3.3 Se uma posição for aberta através do Terminal do Cliente usando um Expert Advisor, o Cliente não poderá designar Stop Loss e/ou Take Profit Orders. Se o Cliente desejar fazer estes pedidos, poderá fazê-lo modificando uma posição existente de acordo com as cláusulas 5.16 - 5.22 e 9.13 - 9.16.

Estou me perguntando se é possível verificar isto de forma programática. Pelo que entendi, não. Inicialmente, é preciso escrever no programa uma função para abrir posições/definir ordens pendentes, levando em conta as condições estabelecidas pelo corretor.
 
tol64:


Não há verificação nesta lista para certos tipos de conta. Aqui está um parágrafo do Regulamento de Operações Comerciais para contas NDD:

Estou interessado em saber se isto pode ser verificado de forma programática. Pelo que entendi, não. É preciso originalmente escrever em um programa uma função para abrir posições / estabelecer ordens pendentes, levando em conta as condições que são estabelecidas pelo corretor.

Eu realmente não entendo as regras para definir ordens, tente jogar com a demonstração e veja o que você pode e não pode fazer. Pelo que entendo nada impede que você programe uma ordem e depois a modifique. É estranho, a menos que você corte a conexão após abrir uma posição não deixando nenhuma parada .
 
tol64:


Não há verificação nesta lista para certos tipos de conta. Aqui está um parágrafo do Regulamento de Operações Comerciais para contas NDD:

Estou interessado em saber se isto pode ser verificado de forma programática. Pelo que entendi, não. Inicialmente, é necessário escrever no programa uma função para abrir posições/definir ordens pendentes, levando em conta as condições estabelecidas pelo corretor.

Não há nenhum problema. Mesmo (se não para uso pessoal, porque você sabe em quais contas (condições comerciais e com quem) usá-la), mas se você enviar a EA para fazer o pedido e o cliente ainda não tiver decidido quais contas e onde ela será usada, mesmo em tipos de contas com a possibilidade de definir um take e stop imediatamente, então por padrão produza a EA com valores zero desses níveis ao definir todos os tipos de pedidos, então com sua modificação (funcionará lá e lá), enquanto, é claro, ninguém cancelou os requisitos e restrições de verificação na p.
 
ivandurak:

Não entendo muito bem as regras para definir ordens, tente jogar com a demonstração, o que você pode e o que você não pode. Até onde eu entendo nada impede que você estabeleça uma ordem programática e depois a modifique. Certo, parece estranho, a menos que você corte a conexão após abrir uma posição não deixando nenhuma parada .

))) Não. Você me entendeu mal completamente. Eu não escrevi sobre "set programático", eu escrevi sobre definição programática. Em alguns tipos de conta você não pode abrir imediatamente uma posição e definir paradas/paradas, o que seria preferível/seguro para mim. No mql5, se não estou enganado, parece ser possível determinar isto. Gostaria de poder determinar isso e, dependendo da definição, escolher qual função utilizar.
 
Roman.:

Não há nenhum problema. Mesmo (se não para uso pessoal, porque você sabe em quais contas (condições de negociação e com quem) usá-la), mas se você fizer uma EA para pedir e o cliente ainda não tiver decidido em quais contas e onde irá usá-la, mesmo em tipos de contas com a possibilidade de definir um take e stop imediatamente, então você ainda faz uma EA com valores zero desses níveis por padrão ao definir todos os tipos de ordens, então com sua modificação (funcionará lá e lá), enquanto, é claro, ninguém cancelou os requisitos e restrições de verificação na p

Sim, não há problema quando há uma solução. Você só precisa usar o que você tem e usá-lo corretamente).
 

Roman. e ivandurak muito obrigado por suas respostas, mas isto ainda é difícil para mim. Encontrei uma sugestão em outro fórum sobre como fazer isto, mas até agora não posso aplicá-la ao meu código habitual

na BuyTrue, SellTrue;// definir variáveis que servirão como estas bandeiras
....
//--- Condição para compra
se (BuyTrue==0 && ... mais suas outras condições) // condição de posição aberta
{
....
OrderSend(....); //função para abrir um pedido
BuyTrue=1; // Se BuyTrue=1, a condição para abertura de posição não será totalmente satisfeita
// conseqüentemente, em um sinal de compra repetida não será aberto um comércio
SellTrue=0; // Em SellTrue=0 a condição da abertura da posição será totalmente satisfeita
// portanto, a próxima venda será apenas Sell
....
}

//--- Condição para a venda
se (SellTrue==0 && ... mais suas outras condições) // condição de posição aberta
{
....
OrderSend(....); //função para abrir um pedido
SellTrue=1; // Se SellTrue=1, a condição para abertura do pedido não será totalmente satisfeita
// portanto, em um segundo sinal de Venda, uma posição não será aberta
BuyTrue=0; // Na BuyTrue=0 a condição de abertura de posição será totalmente satisfeita
// conseqüentemente, a próxima negociação será Comprar somente
....
}

Meu código para abrir uma posição

total=OrdensTotal();
if(total<1)
{
// nenhuma ordem aberta identificada
if(AccountFreeMargin()<(1000*Lots))
{
Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin();
retorno(0);
}
// verificar a posição longa (BUY)
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido aberto : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError()));
retorno(0);
}
// verificar a posição curta (SELL)
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido de venda aberto : ",OrderOpenPrice())
}
else Print("Error opening SELL order : ",GetLastError()));
retorno(0);
}
retorno(0);
}

 
SeALALex:

Roman. e ivandurak muito obrigado por suas respostas, mas isto ainda é difícil para mim. Encontrei uma sugestão em outro fórum sobre como fazer isto, mas até agora não posso aplicá-la ao meu código habitual

na BuyTrue, SellTrue;// definir variáveis que servirão como bandeiras descritas acima
....
//--- Condição para compra
se (BuyTrue==0 && ... mais suas outras condições) // condição de posição aberta
{
....
OrderSend(....); //função para abrir um pedido
BuyTrue=1; // Se BuyTrue=1, a condição para abertura de posição não será totalmente satisfeita
// conseqüentemente, em um sinal de compra repetida não será aberto um comércio
SellTrue=0; // Em SellTrue=0 a condição da abertura da posição será totalmente satisfeita
// portanto, a próxima venda será apenas Sell
....
}

//--- Condição para a venda
se (SellTrue==0 && ... mais suas outras condições) // condição de posição aberta
{
....
OrderSend(....); //função para abrir um pedido
SellTrue=1; // Se SellTrue=1, a condição para abertura do pedido não será totalmente satisfeita
// portanto, em um segundo sinal de Venda, uma posição não será aberta
BuyTrue=0; // Na BuyTrue=0 a condição de abertura de posição será totalmente satisfeita
// conseqüentemente, a próxima negociação será Comprar somente
....
}

Meu código para abrir um negócio.

total=OrdensTotal();
if(total<1)
{
// nenhuma ordem aberta identificada
if(AccountFreeMargin()<(1000*Lots))
{
Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin();
retorno(0);
}
// verificar a posição longa (BUY)
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido aberto : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError()));
retorno(0);
}
// verificar a posição curta (SELL)
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red);
if(bilhete>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido de venda aberto : ",OrderOpenPrice())
}
else Print("Error opening SELL order : ",GetLastError()));
retorno(0);
}
retorno(0);
}


Primeiramente, cole seu código no editor via Ctrl+Alt+M (ou pressione SRC no topo do menu), caso contrário é ruim, o que está claro - tudo se mistura sob um só...:-)

Em segundo lugar, leia o tutorial, em particular as informações sobre o link que eu recomendei, abaixo do código está sua descrição e no final da descrição está precisamente descrito - como relatar uma vez um preço acima/abaixo do MA (você terá uma analogia com uma única entrada em uma determinada condição comercial - o uso de bandeiras e tudo), antes de TRABALHAR seu Mago ... :-)))

P.S. ou google search: Como inserir corretamente o código site:mql4.com

 






if (SellTrue==0 && A1<A2 && S1<30 && ADX1<ADX2) // Условие открытия позы
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"AO sample",16384,0,Red);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES ||SellTrue==1)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
        
        if (ticket > 0 && SellTrue==1)   
     {
      SellTrue=1;
      BuyTrue=0;                 
      Alert("По данным условиям сделка уже открывалась"); // Сообщение 
     }
        }
      return(0);
Romano. Não está funcionando, o que está errado?