Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 96

 
Vinin:

Sei sicuro di avere tutti gli apparecchi. Mancano in alcuni punti. Ecco perché la tua logica è difettosa. E molto probabilmente il risultato non è quello che vi aspettavate.
Vitya, sei stata via? Non ti vedo da molto tempo...
 
artmedia70:
Vitya, sei stata via? Non ti vedo da molto tempo...


Oggi ero a casa (quasi).
 
Vinin:

Sono stato a casa oggi (quasi)
Sono quasi a casa per la seconda settimana :))
 
Vinin:

Sei sicuro di avere tutti gli apparecchi. Mancano in alcuni punti. Ecco perché la tua logica è difettosa. E molto probabilmente il risultato non è quello che vi aspettavate.

Se intendi il codice dell'indicatore, lì tutto è ok, l'indicatore funziona, dà segnali sotto forma di frecce (per i buffer degli indicatori buy/sell-4 e 5). Ma quando leggo queste frecce dall'indicatore nell'Expert Advisor, ottengo un'assurdità. Non ho tirato fuori completamente l'Expert Advisor perché la cosa principale è capire come leggere il segnale e fare l'operazione corrispondente. In generale, il problema è nella lettura del segnale.
 
paladin80:

Per incollare correttamente il codice qui, prima clicca su SRC e poi copia il codice lì.

Se ho capito bene, in un certo momento dobbiamo aprire un OP_BUYSTOP e un OP_SELLSTOP ? È accettabile avere altri ordini in sospeso in questo momento? Per esempio, ci sono ordini pendenti, ma prima di aprirne uno nuovo, i vecchi devono essere cancellati?



if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5

if ((volum<=n)==true)// если объем свечей меньше или равно n пунктов 
{ 
OrderSend ( Symbol (), OP_BUYSTOP, параметры);// открываем отложенный ордер байстоп
OrderSend ( Symbol (), OP_SELLSTOP, параметры);// открываем отложенный ордер селлстоп
}

if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)&& OrderTakeProfit()==true) ///если первый открывшийся отложенный ордер закрыт с профитом
{
OrderDelete(1);// удаляем второй открытый отложенный ордер
}

}
bool closeorder;//определим  закрытие ордеров
closeorder=true;

if (closeorder==true)//
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время 
{
for(int i=OrdersTotal()-1; i>=0; i--)// определяем количество открытых позиций, и отложенных ордеров и закрываем все возможные позиции, и отложенные ордера
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
{
for(int D=OrdersTotal()-1; D>=0; D--)
if (OrderSelect(D,SELECT_BY_TICKET,MODE_TRADES)==true)
if (OrderType()==OP_BUYSTOP ) OrderDelete(D); //удаляем отложенный байстоп
if (OrderType()==OP_SELLSTOP) OrderDelete(D);// удаляем отложенный селлстоп

Ho già incollato il codice generico per renderlo più chiaro... Alla fine della giornata volevo chiudere tutte le posizioni e gli ordini possibili...

e al momento dell'apertura di due ordini pendenti (al mattino) non ci sono ordini aperti o posizioni aperte prima, poiché devono essere tutti chiusi a una certa ora della sera. Mi chiedo se la mia chiusura completa dell'ordine è almeno correttamente descritta? =)))



 
artmedia70:

Sinceramente non conosco la logica della vostra funzione. Se debba cancellare gli oggetti o costruirli, non lo so. Dimmi cosa vuoi che faccia e vedremo dove la logica è sbagliata. Tuttavia, se la funzione cerca di costruire un oggetto grafico ma fallisce, significa che esiste già. Qual è il prossimo passo logico nel suo programma? Potete costruire un nuovo oggetto con un nome diverso (per esempio, aggiungete l'ora corrente al nome dell'oggetto (TimeToStr(TimeCurrent()))) o, se avete già un oggetto ma dovete cambiare le sue proprietà, non costruitelo di nuovo, ma cambiate semplicemente le sue proprietà. Allora l'errore non si verificherà più.

È semplice. La cosa principale è sapere cosa vuoi... :)



In realtà, la funzione è semplicemente un sostituto visivo della stampa, mostra semplicemente tutto sullo schermo. Non è ancora scritto molto bene, ma funziona. :) Ci arriverò e lo riscriverò. E poi si può pensare alla domanda che era.

A proposito, se non costruisci nuovi oggetti, ma modifichi le proprietà di quelli esistenti, allora di nuovo... Sarà un mal di testa. L'idea è di visualizzare le ultime N secche sullo schermo. Se sovrascriviamo sempre l'ultimo oggetto, potremmo ritrovarci con un solo oggetto che ha un particolare bug. Potrei andare oltre e selezionare in un ciclo tutti gli oggetti di cui ho bisogno e riscriverli soltanto, ma probabilmente non ne vale la pena, dato che questa funzione è solo per i test e non mi annoia molto dato che ho già troppe cose da fare. Un giorno proverò il codice di quella funzione, e lo porterò a conoscenza, e allora potrò pensarci!

 

È sorta una domanda. Sto scrivendo il seguente esperimento. Ho un mucchio di ordini che, naturalmente, si aprono uno dopo l'altro in base a certi segnali. Se l 'ultimo ordine è chiuso, tutti gli altri ordini a mercato e in sospeso dovrebbero essere chiusi...

Naturalmente, tutto può essere scritto attraverso gli array, ma ho usato un modo ordinario. Ecco qui:

for (int li_ord=OrdersTotal()-1; li_ord>=0; li_ord--)
   {
      if (!OrderSelect(li_ord,SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
        
      g_ticket = OrderTicket();
      g_type = OrderType();

      // Закрытие всех ордеров, если последний ордер закрыт
      if (GetLastOrderState() != 0)
      {
          if (g_type > 1)
          {
              DeletePendingOrders(g_ticket);
          }
          else
          {
              CloseMarketOrders(g_ticket);
          }
      }
   }

Condizione:

 if (GetLastOrderState() != 0)

controlliamo se l'ultimo ordine aperto è chiuso! Poi cominciamo a cancellare gli ordini pendenti e a chiudere gli ordini a mercato...


Ecco la funzione stessa, così non c'è dubbio che c'è qualcosa che non va (Critiche e commenti sono benvenuti, e anche più che benvenuti :)) ):

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
double GetLastOrderState()
{
   double lastOrderCloseTime = -1,                   // Время закрытия последнего ордера
          lastOrderOpenTime = -1;                     // Время открытия последнего ордера
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
  
      if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   
   return (lastOrderCloseTime);
}
 
vovak_85:

Se stai parlando del codice dell'indicatore - tutto va bene lì con le parentesi, l'indicatore funziona, dà segnali sotto forma di frecce (per comprare/vendere - 4 e 5 buffer di indicatori). Ma quando leggo queste frecce dall'indicatore nell'Expert Advisor, ottengo un'assurdità. Non ho tirato fuori completamente l'Expert Advisor perché la cosa principale è capire come leggere il segnale e fare l'operazione corrispondente. In generale, il problema è nella lettura del segnale.
Questo è tuo:
double L_B=iCustom(0,0,"Makedonskii",MM,MP,0,4);

double L_S=iCustom(0,0,"Makedonskii",MM,MP,0,5);

È così che dovrebbe essere:
double L_B=iCustom(NULL,0,"Makedonskii",MM,MP,4,0);

double L_S=iCustom(NULL,0,"Makedonskii",MM,MP,5,0);
Qualcosa del genere.
 
hoz:

In realtà, la funzione è solo un sostituto visivo della stampa, ma visualizza tutto sullo schermo. Non è ancora scritto molto bene, ma funziona... :) Ci arriverò e lo riscriverò. E poi si può pensare alla domanda che era.

A proposito, se non costruiamo nuovi oggetti, ma cambiamo le proprietà di quelli esistenti, allora di nuovo... Sarebbe un mal di testa. Per idea, abbiamo bisogno di visualizzare gli ultimi N-joints sullo schermo. Se sovrascriviamo sempre l'ultimo oggetto, potremmo ritrovarci con un solo oggetto che ha un particolare bug. Potrei andare oltre e selezionare in un ciclo tutti gli oggetti di cui ho bisogno e riscriverli soltanto, ma probabilmente non ne vale la pena, dato che questa funzione è solo per i test e non mi annoia molto dato che ho già troppe cose da fare. Un giorno proverò il codice di quella funzione, e lo porterò a conoscenza, e allora potrò pensarci!

Una volta ho fatto una funzione che visualizza i messaggi in una finestra vuota dell'indicatore. È possibile regolare i colori delle linee visualizzate. È già debuggato. Posso condividerlo se ne avete bisogno.
 
r772ra:
Questo è il tuo: dovrebbe essere così:
Qualcosa del genere.

grazie per la correzione, ma l'algoritmo non ha funzionato correttamente...