E vamos fazer um "desenho animado" (multicurrency) - página 2

 

Você pode modificar ligeiramente minha função para devolver o número total de pedidos para um determinado instrumento e mágico.

 
ALex2008 писал(а) >>

Se você não souber o que fazer com ele, poderá pedir ajuda. A essência de uma coisa - fazê-la funcionar em vários pares, não em um) E testá-la em uma demonstração não é um problema, apenas um ou dois meses, mas o resultado é interessante)

Formule a lógica do Expert Advisor multiforme, quanto mais detalhado melhor, e talvez você não precise de ajuda.

Como regra, a compreensão clara da tarefa é 90% do seu sucesso.

 
sergeev >> :

E, a propósito, você tem erros em seu código! Muitos!

iLow(PERÍODO_H4,0,0) - o que é isto?

Baixo da vela atual))

De fato...! Como funciona no teste então?

Não entendo como consegui isso assim. Deve ser iLow(NULL,PERÍODO_H4,0)

 
xeon >> :

Formule a lógica do especialista multivalente, quanto mais detalhado melhor, e você pode não precisar de mais ajuda.

Como regra, uma compreensão clara da tarefa é 90% do seu sucesso.

Não há nada de errado com a lógica) Eu simplesmente não tenho experiência. Entendo que você precisa rastrear as ordens por qualquer atributo, mas como nunca escrevi nada assim antes, temo que haja apenas uma pergunta... sobre funções e sua implementação)

 
ALex2008 писал(а) >>

Não há nada de errado com a lógica) Eu sou apenas inexperiente... Entendo a necessidade de rastrear as ordens por qualquer atributo, mas como nunca escrevi nada assim antes, temo que haja apenas uma pergunta... sobre funções e sua implementação)

Veja a página anterior para a função

 
Vinin >> :

Veja a função na página anterior

Obrigado) Vou tentar colocá-lo no código)

Começou a escrever...

#define MAGIC 7779

ao invés disso -

   if(OrdersTotal()==0){
      mod=false;
      SetOrders();}

escrevendo isto -

   if( Order_Count_Calculate(Symbol(), MAGIC)==0){
      mod=false;
      SetOrders();}

... falha - 'Order_Count_Calculate' - função não retorna nenhum resultado

Se eu entender corretamente, a função deve encontrar todas as ordens do símbolo atual Símbolo() com um MAGIC
 
ALex2008 писал(а) >>

Obrigado) Vou tentar colocá-lo no código)

Começou a escrever...

Isto é exatamente o que você não quer fio externo _Símbolo = Símbolo();

Embora uma variável possa ser definida, e é melhor atribuir um valor em inite() ou start()

 
Tropeçei na primeira função...( Já entendi, mas não sei como usá-la corretamente...
 
ALex2008 писал(а) >>

Não há nada de errado com a lógica) Eu sou apenas inexperiente... Entendo a necessidade de rastrear as ordens por qualquer atributo, mas como nunca escrevi nada assim antes, temo que haja apenas uma pergunta... sobre funções e sua implementação)

Eh.... Receio que você não entenda..............

a tarefa - "eu quero que voe", não é lógico - o que voou para onde voou, etc., etc.

--------------------------------------------

Um breve exemplo da tarefa:

Uso simultâneo de EURUSD, GBPUSD, USDCHF, USDJPY.

Período H1.

......................

condição de seleção de pares de moedas

Condição de compra

Condição de ajuste da SELL

.......................

Aqui está um pequeno exemplo de implementação:

int MAGIC = 322223;
string Sym[]={"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};    //Внесем в массив валютные пары с которыми будем работать
int start(){
   
   int s = SymbolSelect();                   //Функция выбора валютной пары
   if( SelectOrder( Sym[ s],OP_BUY, MAGIC)<0){   //Если нет установленного ордера по выбранному символу
      UpTrend( Sym[ s]);                       //Проверим условие установки ордера 
   }
   if( SelectOrder( Sym[ s],OP_SELL, MAGIC)<0){  //Если нет установленного ордера по выбранному символу
      DownTrend( Sym[ s]);                     //Проверим условие установки ордера 
   }

}


int SymbolSelect(){
  int s=-1;
  //Условие выбора валютной пары для работы  
   
  return( s)
}
    //+-------------------Выбор ордера---------------------------+
int SelectOrder(string Sym,int Tip,int MAGIC){
    int TotOrd=OrdersTotal();
    int OrdTick=-1;
    for(int OrdPos= TotOrd-1; OrdPos>=0; OrdPos--){
        if(OrderSelect( OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
           if(OrderSymbol()== Sym){                                           //Есть ли ордера с нужным символом
              if(OrderType()== Tip){                                          //Если нужный тип ордера  
                 if( MAGIC==0){ MAGIC=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                 if(OrderMagicNumber() == MAGIC){                            //Есть ли ордера с нужным Магик номером
                    OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
    }}}}}
    return( OrdTick);                                                         //Возвращает тикет найденного ордера или -1
}
bool UpTrend(string Sym){
     //Условие установки BUY ордера
}
bool DownTrend(string Sym){
    //Условие установки SELL ордера
}

etc.

Se você pensar na lógica em detalhes, você não terá nenhum problema com a implementação.

 
xeon >> :

...é isso que quero dizer, se você pensar através da lógica em detalhes, você não terá nenhum problema com a implementação.

Estarei pensando nisso hoje... Eu sinto que encontrei uma dor de cabeça)) Obrigado.

De qualquer forma, aqui está um rascunho com erros... >> me corrija).

extern double Profit = 3000;

int MAGIC = 322223;

string Sym[]={"EURUSD", "GBPUSD", "USDCHF", "USDJPY"};    //Внесем в массив валютные пары с которыми будем работать

double b0, b1, s0, s1, StopLoss, Enter;
bool dwnSym, upSym, mod;

int init(){ Profit*=Point;
}

int start()
{
   
      int s = SymbolSelect();                      //Функция выбора валютной пары
      if( SelectOrder( Sym[ s],OP_BUYSTOP, MAGIC)<0){  //Если нет установленного ордера по выбранному символу
         UpTrend( Sym[ s]);                          //Проверим условие установки ордера 
         }
      if( SelectOrder( Sym[ s],OP_SELLSTOP, MAGIC)<0){ //Если нет установленного ордера по выбранному символу
         DownTrend( Sym[ s]);                        //Проверим условие установки ордера 
         }
      
      
      if( SelectOrder( Sym[ s],OP_BUYSTOP, MAGIC)>0 && AccountProfit()&& (! mod)){  //Если установлен ордер по выбранному символу
         SetStopBuy( Sym[ s]);                                                  //и он открылся, ставим стоп
         }
      if( SelectOrder( Sym[ s],OP_SELLSTOP, MAGIC)>0 && AccountProfit()&& (! mod)){ //Если установлен ордер по выбранному символу
         SetStopSell( Sym[ s]);                                                 //и он открылся, ставим стоп
         }
}

   int SymbolSelect(){
   int s=-1;
   return( s);}
   
//+-------------------Выбор ордера---------------------------+
   int SelectOrder(string Sym,int Tip,int MAGIC){
      int TotOrd=OrdersTotal();
      int OrdTick=-1;
      for(int OrdPos= TotOrd-1; OrdPos>=0; OrdPos--){
         if(OrderSelect( OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
            if(OrderSymbol()== Sym){                                           //Есть ли ордера с нужным символом
               if(OrderType()== Tip){                                          //Если нужный тип ордера  
                  if( MAGIC==0){ MAGIC=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                  if(OrderMagicNumber() == MAGIC){                            //Есть ли ордера с нужным Магик номером
                     OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
      }}}}}
    return( OrdTick);}                                                         //Возвращает тикет найденного ордера или -1


//Условие и установка BUY ордера
   bool UpTrend(string Sym){
       
       if((iOpen( Sym,PERIOD_H4,1) - iClose( Sym,PERIOD_H4,1) <= 0) &&
         (iOpen( Sym,PERIOD_H4,2) - iClose( Sym,PERIOD_H4,2) > 0)){
          upSym=false;
          dwnSym=true;
          CloseOpenOrdersAndCancelPending();
          double Enter=iHigh( Sym,PERIOD_H4,1)+(Ask-Bid)+10*Point;
          OrderSend( Sym, OP_BUYSTOP, 0.1, Enter, 0, 0, Ask+ Profit, 0, 0,0, Green);}
   }

//Условие и установка SELL ордера
   bool DownTrend(string Sym){
       
       if((iOpen( Sym,PERIOD_H4,1) - iClose( Sym,PERIOD_H4,1) >= 0) &&
         (iOpen( Sym,PERIOD_H4,2) - iClose( Sym,PERIOD_H4,2) < 0)){
          upSym=true;
          dwnSym=false;
          CloseOpenOrdersAndCancelPending();
          double Enter=iLow( Sym,PERIOD_H4,1)-10*Point;
          OrderSend( Sym, OP_SELLSTOP, 0.1, Enter, 0, 0, Bid- Profit, 0, 0,0, Green);}
         
   }
   
//-------Вычисление и утановка стопа для бай
void SetStopBuy(string Sym)
   {
      RefreshRates();
      double b0=iLow( Sym,PERIOD_H4,0)-10*Point;
      double b1=iLow( Sym,PERIOD_H4,1)-10*Point;
      
            if( b0< b1) StopLoss= b1;
            else StopLoss= b0;
            RefreshRates();
            mod=OrderModify( OrdTick,OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
   } 
   
 //-------Вычисление и утановка стопа для сел
void SetStopSell(string Sym)
   {
      RefreshRates();
      double s0=iHigh( Sym,PERIOD_H4,0)+(Ask-Bid)+10*Point;
      double s1=iHigh( Sym,PERIOD_H4,1)+(Ask-Bid)+10*Point;
      
            if( s0< s1) StopLoss= s0;
            else StopLoss= s1;
            RefreshRates();
            mod=OrderModify( OrdTick,OrderOpenPrice(), StopLoss,OrderTakeProfit(),0,Red);
   }
   
void CloseOpenOrdersAndCancelPending()
   {
      for (int i=OrdersTotal()-1; i>=0; i--){
      if (!OrderSelect( i, SELECT_BY_POS))  continue;
      if (OrderSymbol()!= Sym)        continue;
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),10);}
   }