[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 84

 
NameLess:


Come avrete notato, il vero motivo non è guardare il codice, ma capire come funziona. Se ti fidi dell'Expert Advisor, ti auguro di avere successo e tutto andrà bene)

Personalmente ho inventato una bicicletta e ho scritto il mio gufo da zero, ma so dove e come funzionano le cose e so perché non funzionano e dove cercare gli errori)

questo è tutto)


Grazie. Sono già sulla strada giusta!))) Ho dovuto scavare in giro, ma ho implementato quello che volevo (almeno funziona in qualche modo :))) ).
 
NameLess:
Sai come impostare il controllo del numero d'ordine? Sono d'accordo, la domanda probabilmente porta un sorriso non celato, trasformandosi in risate in alcuni punti.))) Ma è solo da una settimana che sto curiosando tra i codici di mt-sh. Non conosco ancora tutte le parole )))) Intelligente )))
 
nemo811:
Sai come impostare il controllo del numero d'ordine? Sono d'accordo, la domanda probabilmente provoca un sorriso non celato, che si trasforma in risata in alcuni posti)))) Ma è solo da una settimana che sto curiosando tra i codici di mt-sh. Non conosco ancora tutte le parole )))) intelligente )))


Non posso definirmi un esperto)))

Se hai bisogno di aprire un ordine due volte in determinate condizioni, allora devi creare questa condizione.

In generale, ho iniziato a scrivere il mio programma circa mezzo anno fa, e un semplice dettaglio mi ha aiutato: pensate a cosa volete che faccia l'EA o un pezzo specifico di codice.

In questo caso, sarebbe più facile fare un esempio, e poi sarò in grado di dire più specificamente cosa fare e come farlo, se conosco la soluzione:)

 

esempio a pagina 83, compito di sergeev

Il codice ha funzionato - grazie. Ma quando persone esperte dicono queste parole, si comincia a chiedersi cosa c'è che non va.

)))

 
nemo811:

esempio a pagina 83, compito di sergeev

Il codice ha funzionato - grazie. Ma quando persone esperte dicono queste parole, si comincia a chiedersi cosa c'è che non va.

)))


Se il codice fa quello che deve fare - allora è così))) quello che probabilmente intendevo era che il codice può aprire gli ordini senza sosta, ma l'abbiamo fatto in modo che tutto si apra e rinvii una volta. quindi è OK)
 
NameLess:

Se il codice fa quello che deve fare, allora va bene)) quello che probabilmente volevo dire è che il codice può aprire ordini senza sosta, ma lo abbiamo fatto una volta per apertura e rinvio).

Bene. Grazie ancora.
 
nemo811:

A proposito, consiglio di mettere qualcosa come

if ( OrdersTotal()!=0)

{

BUY = false;

BUY_STOP = false;

BUY_LIMIT = false;

SELL = false;

SELL_STOP = false;

SELL_LIMIT = false;

}

questa è una protezione nel caso abbiate posizioni aperte nel caso in cui dobbiate riavviare il client, altrimenti riaprirà un intero lotto di ordini

Raccomando anche di chiedere: pensa logicamente ad ogni linea - cosa può impedire che funzioni.

 
nemo811:

Ecco una versione leggermente obsoleta di quello su cui sto lavorando attualmente. L'autore drknn mi ha dato il permesso di caricarlo.


Non ha solo dato il permesso di metterlo in giro, ha dato apertamente il permesso di cambiare il codice come si vuole, venderlo e anche il copyright a chi si vuole :)

Basta non litigare per i diritti :)

 
grazie!
 
NameLess:

A proposito, consiglio di mettere qualcosa come

if ( OrdersTotal()!=0)

{

BUY = false;

....

questa è una protezione nel caso abbiate posizioni aperte nel caso in cui dobbiate riavviare il client. altrimenti, riaprirà un intero lotto di ordini

Grazie - questo è un punto importante. Ho risolto questo problema e ho aggiunto dei contatori (grazie a sergeev) per contare gli ordini.

Il codice ora appare come segue (non apre dati inutili quando si riavvia il terminale):

//--------------------------------------------------------------------
extern int     MAGIC       = 0;        //уникальный номер ордера
extern bool    BUY         = false;    //открыть ордер BUY
extern bool    BUY_STOP    = false;    //поставить ордер BUY STOP
extern bool    BUY_LIMIT   = false;    //поставить ордер BUY LIMIT
extern bool    SELL        = false;    //открыть ордер SELL
extern bool    SELL_STOP   = false;    //поставить ордер SELL STOP
extern bool    SELL_LIMIT  = false;    //поставить ордер SELL LIMIT
extern double  Lot         = 0.1;      //объем ордера
extern int     takeprofit  = 0;        //уровень выставления TP, если 0, то TP не выставляется
extern int     stoploss    = 0;        //уровень выставления SL, если 0, то SL не выставляется
extern int     DistanceSet = 40;       //расстояние от рынка для отложенника
extern int     Proskalz    = 3;        //максимально допустимое отклонение цены для рыночных ордеров
//--------------------------------------------------------------------
double SL,TP;
//--------------------------------------------------------------------
int start()
{
   if (BUY)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy");
      BUY=false;
   }
   if (SELL)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell");
      SELL=false;
   }
   if (BUY_STOP)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask + DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask + DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Stop");
      BUY_STOP=false;
   }
   if (SELL_STOP)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid - DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid - DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Stop");
      SELL_STOP=false;
   }
   if (BUY_LIMIT)
   {
      if (takeprofit!=0) TP  = NormalizeDouble(Ask - DistanceSet*Point + takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL  = NormalizeDouble(Ask - DistanceSet*Point - stoploss*Point,Digits); else SL=0;     
      OPENORDER ("Buy Limit");
      BUY_LIMIT=false; 
   }
   if (SELL_LIMIT)
   {  
      if (takeprofit!=0) TP = NormalizeDouble(Bid + DistanceSet*Point - takeprofit*Point,Digits); else TP=0;
      if (stoploss!=0)   SL = NormalizeDouble(Bid + DistanceSet*Point + stoploss*Point,Digits);  else SL=0;              
      OPENORDER ("Sell Limit");
      SELL_LIMIT=false;
   }
return(0);
}
void OPENORDER(string ord)
{
   int SchBuy=SchBuy_b(MAGIC);
   int SchSell=SchSell_b(MAGIC);
   int SchBuyStop=SchBuyStop_b(MAGIC);
   int SchSellStop=SchSellStop_b(MAGIC);
   int SchBuyLimit=SchBuyLimit_b(MAGIC);
   int SchSellLimit=SchSellLimit_b(MAGIC);
   int ticket = -1;
   int err;
   while (ticket<0)
   {
      if (SchBuy<1) {if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSell<1) {if (ord=="Sell") ticket=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyStop<1) {if (ord=="Buy Stop") ticket=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(Ask + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellStop<1) {if (ord=="Sell Stop") ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchBuyLimit<1) {if (ord=="Buy Limit") ticket=OrderSend(Symbol(),OP_BUYLIMIT, Lot,NormalizeDouble(Ask - DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}
      if (SchSellLimit<1) {if (ord=="Sell Limit") ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lot,NormalizeDouble(Bid + DistanceSet*Point,Digits),Proskalz,SL,TP,"",MAGIC,0);}      
      if (ticket==-1) //неудачная попытка
      {  
         ShowERROR();
         err++;Sleep(2000);RefreshRates();
      }
      if (ticket || err >10) return;
   }
return;
}                                    
//--------------------------------------------------------------------
void ShowERROR()
{
   int err=GetLastError();
   switch ( err )
   {                  
      case 1:   return;
      case 2:   Alert("Нет связи с торговым сервером ",Symbol());return;
      case 3:   Alert("Error неправильные параметры ",Symbol());return;
      case 130: Alert("Error близкие стопы   Ticket ",Symbol());return;
      case 134: Alert("Недостаточно денег   ",Symbol());return;
      case 146: Alert("Error Подсистема торговли занята ",Symbol());return;
      case 129: Alert("Error Неправильная цена ",Symbol());return;
      case 131: Alert("Error Неправильный объем ",Symbol());return;
      case 4200:Alert("Error Объект уже существует ",Symbol());return;
      default:  Alert("Error  " ,err," ",Symbol());return;
   }
}

+ contatori appropriati.

Grazie.