[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 88

 

Tutto a posto. Non facciamolo. Sembra che entrambi non abbiamo abbastanza conoscenze. L'autore della domanda ha chiesto come cambiare StopLoss. Non credo che entrerà in profondità.

Prova ad assegnarlo dopo la funzione OrderSend

 
MaxZ:

Cos'è il numero "12" nella funzione OrderSend? :(

E mi hai frainteso sulla selezione degli ordini... È così che dovrebbe essere:

Ciao!

Grazie mille!!! per le vostre risposte!

Non devo essermi espresso bene: l'idea è questa:

Un'operazione di vendita è fatta a 1.4545... il prezzo va contro la tendenza - 1.4585... e ALLORA - un ordine pendente dovrebbe essere piazzato a 1.4565.

il mio codice non funziona correttamente:

void otlogka (int order)
{  
   int a, k=OrdersTotal();
   for (a=k-1; a>=0; a--){
         if (OrderSelect(a, SELECT_BY_POS, MODE_TRADES)){
            if (OrderType()==OP_BUY){
               if (Bid*Point-OrderOpenPrice()>40)
               RefreshRates();
               if (k>1){
                  {
                     order=OrderSend(Symbol(),OP_SELLLIMIT,0.02,OrderOpenPrice()+20*Point,1,SL,0,"Otlogka",mn,5,0);
                  }}}}}
    
           if (OrderType()==OP_SELL){
               if (Ask*Point-OrderOpenPrice()<40)
                  RefreshRates();
                  if (k>1){
                {
                  order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);
                }}}

}

Per favore aiutatemi!!!

 
FOReignEXchange:

Ti ho detto che mentre la funzione OrderSend è in esecuzione, il prezzo può cambiare. Quindi dovete assegnarlo dopo, quando è già cambiato.

Si può fare così:

if (Opn_B)
{
   Alert("Попытка открыть ордер Buy...");
   RefreshRates();
   Ticket = OrderSend(Symb, OP_BUY , Lots, Ask, Slippage, 0, 0, NULL, MAGIC, 0, Blue);
   if (Ticket > 0)
   {
      if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
      if (OrderCloseTime() == 0)
      {
         Alert("Открыт ордер Buy ", Ticket, ".");
         Opn_B = False;
         SL = OrderOpenPrice()-StopLoss*Point;
         TP = OrderOpenPrice()+TakeProfit*Point;
         
         Alert("Попытка модифицировать ордер Buy ", Ticket, "...");
         if (OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0, Blue))
            Alert("Ордер Buy ", Ticket, " модифицирован.");
         else
            Alert("Ошибка: ", GetLastError());
      }
      else
         Alert("Да ну нафиг!?");
   }
   else
      Alert("Ошибка: ", GetLastError());
}
Ci sono pro e contro per ogni approccio.
 
smartemiy:

Ciao!

Grazie mille!!! per le risposte!

Devo averla pronunciata male: l'idea è questa:

C'è un'operazione di vendita a 1.4545... il prezzo va contro la tendenza - 1.4585... e ALLORA - un ordine pendente dovrebbe essere piazzato a 1.4565.

il mio codice non funziona correttamente:

Per favore aiutatemi!!!

Bid e Ask non devono essere moltiplicati per Point. Ha catturato subito la mia attenzione.

Le condizioni dovrebbero essere costruite in modo diverso:

if (Bid-OrderOpenPrice() > 40*Point)
{...}
if (OrderOpenPrice()-Ask > 40*Point)
{...}

Inoltre non mi è chiaro quale variabile hai SL? Che valore ha? Dove si calcola?

E questo

           if (OrderType()==OP_SELL){
               if (Ask*Point-OrderOpenPrice()<40)
                  RefreshRates();
                  if (k>1){
                {
                  order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);
                }}}

Dovresti metterlo in un ciclo. Un ciclo con ricerca dell'ordine dovrebbe essere comune per gli ordini BUY e SELL.

Devi essere davvero pessimo nella programmazione. Ti consiglio di rileggere il libro di testo e guardare gli esempi che vi sono riportati per scrivere un semplice Expert Advisor, il calcolo degli ordini e le funzioni di trading.


Anche il tuo errore: RefreshRates() dovrebbe essere messo prima di voler usare variabili predefinite o array di serie temporali, non dopo...

 
MaxZ:

Bid e Ask non hanno bisogno di essere moltiplicati per Point. Ha subito attirato la mia attenzione...

Le condizioni dovrebbero essere costruite in modo diverso:


Non devi mettere le parentesi?

if ((Bid-OrderOpenPrice()) > 40*Point)
{...}
if ((Ask-OrderOpenPrice()) < 40*Point)
 
MaxZ:

Bid e Ask non hanno bisogno di essere moltiplicati per Point. Ha subito attirato la mia attenzione...

Le condizioni dovrebbero essere costruite in modo diverso:

Non sono nemmeno sicuro di quale variabile hai SL? Che valore ha? Dove si calcola?

E questo

Devi metterlo in un ciclo...

Sei davvero pessimo nella programmazione... Ti consiglio di rileggere il tutorial e guardare gli esempi di scrittura di un semplice Expert Advisor, di calcolo degli ordini e delle funzioni di trading.

Questo è il normale Stop Loss = SL
 
FOReignEXchange:


Non devi mettere le parentesi?

Non necessariamente. Funzionerà senza le staffe! :)

Dipende da come ti piace. La scrittura a mano! :D

 
smartemiy:
Questo è un normale Stop Loss = SL.
Come si calcola? E perché è comune per comprare e vendere?

smartemiy:

c'è un'operazione di vendita a 1.4545... il prezzo va contro la tendenza - 1.4585... e ALLORA - un ordine pendente dovrebbe essere piazzato a 1.4565.

A proposito, se è contro la tendenza, le condizioni dovrebbero essere negative:

if (Bid-OrderOpenPrice() < -40*Point)
{...}
if (OrderOpenPrice()-Ask < -40*Point)
{...}

Di solito dalle espressioni

 ProfitBUY  = Bid-OrderOpenPrice();
ProfitSELL = OrderOpenPrice()-Ask;

Possiamo trovare il profitto del trade corrispondente in pip. Se il profitto è negativo, è già una perdita. Qui controlliamo se la perdita è più di 40 pips, dobbiamo piazzare un ordine pendente.

 
MaxZ:
Come si calcola? E perché è comune per comprare e vendere?

Lostop loss non è così importante, ora...

il codice, in teoria, funzionerà con le vostre regolazioni

 
smartemiy:

Lo stop loss non è così importante, ora...

Il codice, in teoria, funzionerà? Con le vostre correzioni

Può funzionare, ma funzionerà correttamente?

Di nuovo, dal tuo problema:

Smartemiy:

"Un'operazione di vendita è fatta a 1.4545... il prezzo va contro la tendenza - 1.4585... e ALLORA - un ordine pendente dovrebbe essere piazzato a 1.4565".

È stato aperto un ordine SELL. OrderOpenPrice() restituirà 1,4545.

Il prezzo va controcorrente. Ask = 1,4585. Condizione:

if (OrderOpenPrice()-Ask <= -40*Point)

Funzionerà (mettere un segno "<=").

Analizziamo il seguente codice:

order=OrderSend(Symbol(),OP_BUYLIMIT,0.02,OrderOpenPrice()-20*Point,1,SL,0,"Otlogka",mn,5,0);

Un ordine pendente BUYLIMIT è impostato al prezzo di 1.4545-20*Point = 1.4525. Deve essere 1,4565.


Ma prima di farlo, provate a riscrivere l'intero codice. Ci sono molti errori e alcuni frammenti sembrano non capire quello che si sta scrivendo.