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

 

Boa tarde. A questão é a seguinte. Nolivro MQL4 daS.K. , naseção "Operações Comerciais", há um exemplo de um script simples que modifica uma ordem pendente cujo preço declarado é maior do que o de outras ordens pendentes (modifyorderprice.mq4) como segue:

//--------------------------------------------------------------------
// modifyorderprice.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   int Tral=10;                                 // Дист. приближения
   string Symb=Symbol();                        // Финанс. инструмент
   double Dist=1000000.0;                       // Предустановка
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // Не наш фин.инструм.
         if (OrderType()<2) continue;           // Рыночный ордер  
         //------------------------------------------------------ 4 --
         if(NormalizeDouble(MathAbs(OrderOpenPrice()-Win_Price),Digits)
            < NormalizeDouble(Dist,Digits))     // Выбираем ближайший
           {
            Dist=MathAbs(OrderOpenPrice()-Win_Price);// Новое значение
            int    Tip   =OrderType();          // Тип выбранного орд.
            int    Ticket=OrderTicket();        // Номер выбранн. орд.
            double Price =OrderOpenPrice();     // Цена выбранн. орд.
            double SL    =OrderStopLoss();      // SL выбранного орд.
            double TP    =OrderTakeProfit();    // TP выбранного орд.
           }                                    // Конец if
        }                                       // Конец анализа ордера
     }                                          // Конец перебора орд.
//--------------------------------------------------------------- 5 --
   if (Tip==0)                                  // Если отложенных нет
     {
      Alert("По ",Symb," отложенных ордеров нет");
      return;                                   // Выход из программы
     }
//--------------------------------------------------------------- 6 --
   while(true)                                  // Цикл закрытия орд.
     {
Ou há um erro neste script no bloco 5-6, porque (como eu vejo) a linha
if (Tip==0)                                  // Если отложенных нет
deve ser da forma
if (Tip<2)                                  // Если отложенных нет
uma vez que todos os tipos de ordens não pendentes (de mercado) têm tipo 0 ou 1, ou seja, menos de 2.

Ou eu entendi algo errado.

Pergunta: Você poderia esclarecer: se eu entendi algo errado, o que é isso?

Agradecemos antecipadamente sua resposta.

 
7777877:

Boa tarde. Tenho a seguinte pergunta. Nolivro MQL4da S.K. , naseção "Operações Comerciais", há um exemplo de um script simples que modifica uma ordem pendente cujo preço declarado está mais próximo do ponto em que o script está anexado do que os preços de outras ordens pendentes(

Ou há um erro neste script no bloco 5-6, porque (como eu vejo) a linha

deve ser

assim porque todos os tipos de ordens não-pendentes (de mercado) têm tipo 0 ou 1, ou seja, menos de 2.

Ou eu entendi algo errado.

Pergunta: você poderia me deixar claro: se eu entendi algo errado, o que

exatamente?

Obrigado antecipadamente pela resposta

querida... não escreva em letras tão grandes aqui... você pode quebrar seus olhos :-)

e que... antes de fazer perguntas... você já tentou ler o BACKGROUND no MetaEditor? Tudo isso?...para começar...para não fazer perguntas estúpidas sobre tipos e coisas assim....

===

Tipo de operação para a função OrderSend(). Pode ser qualquer um dos seguintes valores:

Constante Valor Descrição
OP_BUY 0 Compre
OP_SELL 1 Venda
OP_BUYLIMIT 2 COMPRA LIMITAR ordem pendente
OP_SELLLIMIT 3 Pedido de LIMITE DE VENDA Pendente
OP_BUYSTOP 4 Ordem STOP Pendente de compra
OP_SELLSTOP 5 Pendente da ordem de parada da venda
 

mas quanto ao tipo - não há nada de errado... exatamente ==0 deve ser...

porque no terceiro bloco

      if (OrderType()<2) continue;           // Рыночный ордер  

ordens de mercado são puladas...

===

e se as ordens pendentes forem encontradas na lista de ordens, a variável TYPE não será igual a 0

---

 

Boa tarde. Você pode me dar uma dica?

Por exemplo, temos critério para que a MA passe pelo Level_R e Level_S:

int Criterion;
double MA_1=iMA(......,0);
double MA_2=iMA(......,1);
double MA_3=iMA(......,2);
if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 MA_3 <= Level_S_3) Criterion=1;
if(MA_1 > Level_R_1 && Ma_2 <= Level_R_2 MA_3 <= Level_R_3) Criterion=2;

Pergunta: como memorizar o critério para que ele tenha um valor de 1 ou 2 (dependendo do passe) até que um novo passe ocorra e não seja reiniciado em carrapatos subseqüentes .

 
Colocar a definição da variável fora da função Start ou outra função... Dentro de variáveis globais...
 
Aleksander:
Colocar a definição da variável fora da função Start ou outra função... Dentro de variáveis globais...
Eu tentei isso, e ele tem jurado... insinuando a minha incompetência.
 
então se o texto for pequeno, poste o texto inteiro... 20-30 linhas no máximo
 
int Criterion, Crit;
int start()
 {
  Crit= Fun_Criterion( Criterion); 

  switch(Crit)
   {
   /************/
   }
return(0);
 }

Fun_Criterion(int Criterion)
 {
  if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 MA_3 <= Level_S_3) Criterion=1;
  if(MA_1 < Level_R_1 && Ma_2 >= Level_R_2 MA_3 >= Level_R_3) Criterion=2;

  return(Criterion);
 }
 

por que existem intermediários? e qual é a função do FUN?

int Criterion;
int start() {
  Fun_Criterion(); 

  switch( Criterion)
   {
   /************/
   }
  return(0);
}
//-----------------------------
void Fun_Criterion() {
  if(MA_1 > Level_S_1 && Ma_2 <= Level_S_2 &&  MA_3 <= Level_S_3) Criterion=1;
  if(MA_1 < Level_R_1 && Ma_2 >= Level_R_2 &&  MA_3 >= Level_R_3) Criterion=2;
 }

E && não estão no lugar certo...

 
Do meu ponto de vista, era o PARÂMETRO TRANSFERÍVEL))))), mas eu não poderia passar sem ele)))))) Obrigado, consertou-o e está funcionando.
Razão: