[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 149

 
paladin80:
A abertura do parêntese { deve ser colocada antes do preço[...]=Ask; (ver abaixo). Leia novamente sobre o operador "se". Se não houver parênteses imediatamente após o "se", ele trata apenas de uma ação (você tem preço[...]=Ask;), se várias ações forem necessárias, elas devem ser colocadas em {...} imediatamente após o "se".

Obrigado, mas coloquei parênteses logo após a declaração, como sugerido por você,
mas não mudou nada. Veja a captura de tela - mostra que a EA abriu uma posição de compra
e o preço desceu e cruzou os níveis de 1.2100 e 1.2200 e posições pelo operador

se para abrir posições de compra às 1.2100 e 1.2200 - não abriu.


 
alex12:
Obrigado, mas coloquei parênteses logo após a declaração, como você sugeriu,
mas não mudou nada. Veja a captura de tela - mostra que o Expert Advisor abriu uma posição de compra
e o preço desceu e cruzou os níveis de 1.2100 e 1.2200 e as posições pela condição do operador

se para abrir posições de compra às 1.2100 e 1.2200 - não abriu.


não é necessário colocar o operador de retorno após o término do pedido para terminar o processamento do tick?
 
alex12:
Obrigado, mas coloquei parênteses logo após a declaração, como você sugeriu,
mas não mudou nada. veja a captura de tela - ela mostra que a EA abriu uma posição de compra
e o preço caiu e cruzou os níveis 1.2100 e 1.2200 e posições de acordo com a declaração

Se para abrir posições de compra às 1.2100 e 1.2200 - não abriram.

Você abre a primeira posição manualmente ou deseja que as ordens pendentes sejam colocadas após o preço ter atravessado algum nível e depois, com base em sua presença? Tente desta forma:
if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(SELECT_BY_POS,MODE_TRADES)
      {  if (OrderSymbol()!=Symbol())  continue;
         if (OrderType()==OP_BUYLIMIT) return(0);
}  }  }

if (OrdersTotal()>0)
{  for (i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {  if (OrderSymbol()!=Symbol()) continue;
         if (OrderType()==OP_BUY)
         {  for (int j=0; j=10-1; j++}
            {  OrderSend (Symbol(),OP_BUYLIMIT,Lot,price[j],10,0,Ask+g*Point,"My order #",11+j);
               Sleep(10*1000);
      }  }  }
}  }
Naturalmente, ainda precisamos de tratamento de erros no caso de uma ordem pendente ser rejeitada pela DC.
 
OlegTs:
Não deveríamos colocar o operador de retorno após o término do pedido para terminar o processamento de tick?

Obrigado. Coloco o operador de retorno após o fim do pedido e nada mudou.


extern double Lot=1;
int g=20; //тейкпрофит
double price[10];   // Заданный уровень 
//-----------------------
int init()
  {
double price[10];   // объявляем массив из 5 элементов           
price[0] = 1.2100; // обращаемся к первому элементу массива и 
                   // присваиваем ему цену. Обратите внимание 
                   // на то, что индекс первого элемента 
                   // начинается с 0. Это важная особенность,
                   // к которой нужно привыкнуть.   
price[1] = 1.2200;  // обращаемся ко второму элементу 
price[2] = 1.2300;  // и так далее 
price[3] = 1.2400; 
price[4] = 1.2500;
price[5] = 1.2600; 
price[6] = 1.2700;  
price[7] = 1.2800; 
price[8] = 1.2900;
price[9] = 1.3000;  
   return(0);
  }
//---------------
int start()
   {
// начало открытия ордеров 
   if (OrdersTotal()>0)return(0);

   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)//проверка наличия откр.поз
   {
   price[0]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2100,10,0,Ask+g*Point,"My order #",11);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[1]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2200,10,0,Ask+g*Point,"My order #",12);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[2]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2300,10,0,Ask+g*Point,"My order #",13);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[3]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2400,10,0,Ask+g*Point,"My order #",14);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[4]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2500,10,0,Ask+g*Point,"My order #",15);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[5]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2600,10,0,Ask+g*Point,"My order #",16);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[6]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2700,10,0,Ask+g*Point,"My order #",17);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[7]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2800,10,0,Ask+g*Point,"My order #",18);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[8]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2900,10,0,Ask+g*Point,"My order #",19);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[9]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.3000,10,0,Ask+g*Point,"My order #",20);return;
   }
      return(0);
  }
//+------------------------------------------------------------------+
 
paladin80:
Você abre a primeira posição manualmente ou quer que as ordens pendentes sejam abertas quando o preço atinge um certo nível e depois, com base nisso? Tente o seguinte:. É claro, precisamos de mais tratamento de erros no caso de uma ordem pendente ser rejeitada pela DC.

Se o preço atingir um determinado nível e depois abrir uma posição nos níveis definidos nas ordens.

Acontece que temos uma posição em um nível - até que ela fecha ao mesmo tempo.

 
alex12:

...

Uma postura de cada vez no mesmo nível - até fecharem sobre a corrente.

Uma estratégia arriscada, eu não brincaria com ela.
 
paladin80:
Você abre a primeira posição manualmente ou deseja que as ordens pendentes sejam colocadas após o preço ter ultrapassado um certo nível? Tente isto: Não há tratamento de erros caso sua empresa de corretagem rejeite uma ordem pendente.

Obrigado pelo código de dicas, claro, mas como não sou um programador muito bom, não consegui encontrar o erro: "}". - parênteses não fechados

Eu olhei seu código no Notepad++ em zoom in e não consegui corrigir o erro.

Estou vendo. Estou interessado no código em si, não no TS.

Ele gera o erro "}". - Parênteses desequilibrados

Eu não sei como consertá-lo.

extern double Lot=1;
int g=20;          //тейкпрофит
double price[5];   // Заданный уровень 
//-----------------------
int init()
  { 
double price[]={1.2100,1.2200,1.2300,1.2400,1.2500}; // объявляем массив из 5 элементов  
   return(0);
  }
//---------------
int start()
   {
// начало открытия ордеров 
   if (OrdersTotal()>0)return(0);  
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)//проверка наличия откр.поз
   {
   price[0]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2100,10,0,Ask+g*Point,"My order #",11);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[1]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2200,10,0,Ask+g*Point,"My order #",12);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[2]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2300,10,0,Ask+g*Point,"My order #",13);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[3]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2400,10,0,Ask+g*Point,"My order #",14);return;
   }
   if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==True)//проверка наличия откр.поз
   {
   price[4]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2500,10,0,Ask+g*Point,"My order #",15);return;
   }
   if (OrdersTotal()>0)
   {  
   for (int i=OrdersTotal()-1;i>=0;i--)
   {  
   if (OrderSelect(SELECT_BY_POS,MODE_TRADES)
   { 
   if (OrderSymbol()!=Symbol()) continue;
         
   if (OrderType()==OP_BUYLIMIT) return(0);
   } 
   }
   }
   if (OrdersTotal()>0)
   { 
   for (i=OrdersTotal()-1;i>=0;i--)
   {  
   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
   { 
   if (OrderSymbol()!=Symbol()) continue;
   if (OrderType()==OP_BUY)
   {
   for (int j=0;j=5-1;j++}
   { 
   OrderSend (Symbol(),OP_BUYLIMIT,Lot,price[j],10,0,Ask+g*Point,"My order #",11+j);
   Sleep(10*1000);
   } 
   } 
   }
   } 
   }
      return(0);
   }
//+------------------------------------------------------------------+
 

Você pode me dizer por que a EA não abre uma posição ao testar, eu não entendo por que - eu acho que escrevi o código corretamente.

extern double Lot=1;
//--------------------------------------------------------------------
int g=20; //тейкпрофит
double price[5];   // Заданный уровень 
//--------------------------------------------------------------------
int init()
  { 
double price[]={1.2100,1.2200,1.2300,1.2400,1.2500}; // объявляем массив из 5 элементов  
   return(0);
  }
//---------------
int start()
   {
   double WMA0=iEnvelopes(NULL,0,1,MODE_SMMA,0,PRICE_WEIGHTED,0.001,MODE_PLUSDI,0);
   double WMA1=iEnvelopes(NULL,0,1,MODE_SMMA,0,PRICE_WEIGHTED,0.001,MODE_PLUSDI,0);
   double WMA2=iEnvelopes(NULL,0,1,MODE_SMMA,0,PRICE_WEIGHTED,0.001,MODE_PLUSDI,0);
   double WMA3=iEnvelopes(NULL,0,1,MODE_SMMA,0,PRICE_WEIGHTED,0.001,MODE_PLUSDI,0);
   double WMA4=iEnvelopes(NULL,0,1,MODE_SMMA,0,PRICE_WEIGHTED,0.001,MODE_PLUSDI,0);

   // начало открытия ордеров 
   if (OrdersTotal()>0)return(0);// не открывает новые пока не закроются открытые
   
   if (price[0]<WMA0&&price[0]>WMA0) //Buy
   {                           
   price[0]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2100,10,0,Ask+g*Point,"My order #",1);return;
   }
   else
      if (price[1]<WMA1&&price[1]>WMA1) //Buy
   {                           
   price[1]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2200,10,0,Ask+g*Point,"My order #",2);return;
   }
   else
      if (price[2]<WMA2&&price[2]>WMA2) //Buy
   {                           
   price[2]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2300,10,0,Ask+g*Point,"My order #",3);return;
   }
   else
      if (price[3]<WMA3&&price[3]>WMA3) //Buy
   {                           
   price[3]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2400,10,0,Ask+g*Point,"My order #",4);return;
   }
   else
      if (price[4]<WMA4&&price[4]>WMA4) //Buy
   {                           
   price[4]=Ask;
   OrderSend (Symbol(),OP_BUY,Lot,1.2500,10,0,Ask+g*Point,"My order #",5);return;
   }

return(0);
} 
/////////////////////////////////////////////////////////////////////////////////////////
 
alex12:

Você pode me dizer por que a EA não abre uma posição ao testar, não tenho certeza do porquê - acho que escrevi o código corretamente.


Ao abrir uma ordem de mercado (OP_SELL ou OP_BUY), somente os últimos preços Bid (para venda) ou Ask (para compra) podem ser usados como preço de abertura.

algo como isto.

 
alex12:

Você pode me dizer por que a EA não abre uma posição ao testar, eu não entendo por que - o código parece estar escrito corretamente.


Como um valor pode ser maior e menor que outro ao mesmo tempo?

if ( price[0]<WMA0 && price[0]>WMA0 )