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

 

Caro, ho bisogno di aiuto.

Ho preso il codice per la contabilità, l'apertura e la chiusura degli ordini dal tutorial (tradingexpert.mq4). Il codice è destinato a funzionare con una posizione, io ho bisogno di avere cinque posizioni.

Abbiamo leggermente modificato il codice nel modo seguente (le linee cambiate sono in grassetto), in modo che le posizioni siano aperte nella giusta quantità, ma quando invertiamo, solo una posizione viene chiusa e quella inversa viene aperta subito.

Come posso fare in modo che tutte le posizioni siano chiuse all'inversione, e che solo la posizione opposta sia aperta?

   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>5)                           // Было не более одного орд, стало не более пяти
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Total < 5 && Opn_B==true)     // Открытых орд. нет +. Было Total < 1, стало Total < 5
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         SL=Bid - New_Stop(StopLoss)*Point;     // Вычисление SL откр.
         TP=Bid + New_Stop(TakeProfit)*Point;   // Вычисление TP откр.
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                             // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
   // Закрытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..
        {                                       //и есть критерий закр
         Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа..");
         RefreshRates();                        // Обновление данных
         Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy
         if (Ans==true)                         // Получилось :)
           {
            Alert ("Закрыт ордер Buy ",Ticket);
            break;                              // Выход из цикла закр
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
 
Forexman77:

Caro, ho bisogno di aiuto.

Ho preso il codice per la contabilità, l'apertura e la chiusura degli ordini dal tutorial (tradingexpert.mq4). Il codice è inteso per funzionare con una posizione, io ho bisogno di avere cinque posizioni.

Abbiamo leggermente modificato il codice nel modo seguente (le linee cambiate sono in grassetto), in modo che le posizioni siano aperte nella giusta quantità, ma quando invertiamo, solo una posizione viene chiusa e quella inversa viene aperta subito.

Come posso fare in modo che tutte le posizioni siano chiuse all'inversione, e che solo la posizione opposta sia aperta?


Fate di Ticket un array Ticket[5], memorizzate tutti e 5 i biglietti in esso. Al momento della chiusura, scorrere tutti i biglietti di conseguenza.
 
Vinin:

Non puoi essere considerato un principiante dal livello di utilizzo delle librerie. Avendo guardato il tuo codice, mi ci vorrebbero due settimane per capirlo. Se non di più. Quindi penso che non otterrai una risposta.
Vitya, non c'è bisogno di capire nulla - l'uomo vuole rendere le variabili globali da una "sandbox" (EA con le sue librerie) visibili nell'altra "sandbox" (libreria compilata). :)))
 

Non sono un progamer, sono un costruttore di codice. Così ho costruito questo indicatore (vedo che si può fare un'esposizione testuale, non un file t-questo è quello che farò per renderlo più facile da capire.

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
{
SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 2);
SetIndexBuffer(0,Buffer);
return(0);
}
// -------------------------------------------------------------------

int deinit()
{
return(0);
}
//--------------------------------------------------------------------

int start()
{
int StartBar = Bars - IndicatorCounted() - 1;
for(int i = StartBar; i >= 0; i--)
{
if(TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1]))
Buffer[i] = 0;
else
Buffer[i] = Buffer[i+1];
if(Close[i]>Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее и преддыдущее движение растут
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее и преддыдущее движение падают
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]>Close[i+1]&&Close[i+1]<Close[i+2]){//если текущее лвижение растет а предыдущее падает
Buffer[i] += NormalizeDouble((Close[i+1] - Close[i])/Point,0);}
if(Close[i]<Close[i+1]&&Close[i+1]>=Close[i+2]){//если текущее движение падает а предыдущее растет
Buffer[i] += NormalizeDouble((Close[i] - Close[i+1])/Point,0);}
}
return(0);
}
//--------------------------------------------------------------------

Mostra la somma dei punti e la dinamica della loro somma durante la settimana - a timeframes più piccoli, se il movimento precedente continua da Close[i+2] a Close[i+1] il movimento attuale Close[i] viene aggiunto, se contrario - viene sottratto. Dovrei prescriverlo in modo che il programma veda la chiusura di venerdì invece di chiudere la barra-. So che può essere fatto con DayOfWeek e 5 (il numero di venerdì), ma come posso farlo praticamente? Aiuto.

 
TarasBY:
Vitya, non c'è niente da risolvere qui - la persona vuole che le variabili globali di una sandbox (EA con le sue librerie) siano visibili in un'altra sandbox (libreria compilata). :)))

Igor, un po' sbagliato! Nella "sandbox" (libreria compilata) solo le funzioni e tutte le variabili sono dichiarate nell'inluder. E le variabili che sono dichiarate nell'inluder (include file) dovrebbero essere visibili nel gufo, perché ho inserito l'inluder direttamente nel gufo. Non sei d'accordo?
 
Vitek2010:

Non sono un progamer, sono un costruttore di codice. Così ho costruito questo indicatore (vedo che si può fare un'esposizione testuale, non un file t-questo è quello che farò per renderlo più facile da capire.

Mostra la somma dei punti e la dinamica della loro somma durante la settimana - a timeframes più piccoli, se il movimento precedente continua da Close[i+2] a Close[i+1] il movimento attuale Close[i] viene aggiunto, se contrario - viene sottratto. Dovrei prescriverlo in modo che il programma veda la chiusura di venerdì, invece di chiudere la barra. So che può essere fatto con DayOfWeek e 5 (il numero di venerdì), ma come posso farlo praticamente? Aiuto.


Andrà bene?

//+------------------------------------------------------------------+
//|                                                    Vitek2010.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--------------------------------------------------------------------
double Buffer[];
//--------------------------------------------------------------------

int init()
  {
   SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,2);
   SetIndexBuffer(0,Buffer);
   return(0);
  }
// -------------------------------------------------------------------

int deinit()
  {
   return(0);
  }
//--------------------------------------------------------------------

int start()
  {
   int StartBar=Bars-IndicatorCounted()-1;
   if (StartBar>1) StartBar--;
   
   for(int i=StartBar; i>=0; i--)
     {
      Buffer[i]=Buffer[i+1];
      int pos0=iBarShift(NULL, PERIOD_W1, Time[i]);
      int pos1=iBarShift(NULL, PERIOD_W1, Time[i+1]);
      if (pos0==pos1) 
         Buffer[i]+=MathAbs(Close[i]-Close[i+1]);
      else 
         Buffer[i]=MathAbs(Close[i]-Close[i+1]);
     }
   return(0);
  }
//--------------------------------------------------------------------
 
hoz:

Igor, un po' sbagliato! Solo le funzioni sono nella sandbox (libreria compilata), e tutte le variabili sono dichiarate nell'inluder. E le variabili che sono dichiarate nell'inluder (include file) dovrebbero essere visibili nel gufo, perché ho inserito l'inluder direttamente nel gufo. Non siete d'accordo?
allora cosa c'entra il riferimento alla libreria compilata?
 
Vinin:


Va bene così?

No. Mi spiego - il vostro forum è come una speranza per l'ultima roccaforte competente del prog. e l'inserimento di dimensioni - è così che la scrittura PERIOD_W1 lo vedema né l'uso di dimensioni né l'uso di punti di riferimento fissi come date ottengono alcun effetto desiderato. Ho postato una domanda specifica su Friday - a proposito il tuo codice non compila perché dice 'version' - proprietà sconosciuta, quindi se non sai come mettere DayOfWeek e 5 (il numero di venerdì) nel codice altre opzioni non ti aiuteranno .
 
Vitek2010:
No. Mi spiego - il vostro forum è come una speranza per l'ultima roccaforte competente del prog. e l'inserimento di dimensioni - è così che la scrittura PERIOD_W1 lo vedema né l'uso di dimensioni né l'uso di dati fissi come date ottengono alcun effetto desiderato. Ho postato una domanda specifica su Friday - a proposito il tuo codice non compila perché dice 'version' - proprietà sconosciuta, quindi se non sai come mettere DayOfWeek e 5 (il numero di venerdì) nel codice altre opzioni non ti aiuteranno .

TimeDayOfWeek(Time[i]) non specifica Time[i] ma una data specifica nel formato D'2014.01.27'.

E se avete bisogno di determinare che giorno è, basta chiamare DayOfWeek().

 
evillive:

In TimeDayOfWeek(Time[i]) non si imposta Time[i] ma una data specifica nel formato D'2014.01.27'.

Se volete determinare che giorno è, basta chiamare DayOfWeek().

Dove hai letto di TimeDayOfWeek () (nell'esempio)? :)))
Motivazione: