Ich schreibe kostenlos einen Ratgeber - Seite 85

 
Evgenij Litvintsev:

Guten Tag, vielleicht hat ja jemand Interesse daran, meine Strategie zu automatisieren. Es funktioniert jetzt, aber im halbautomatischen Modus, ich würde es gerne automatisieren.


Kann ich die Handelsergebnisse einsehen?

 

Guten Abend, könnten Sie mir bitte sagen, wie ich eine Ticketbestellung, ein Los und einen Gewinn mit einer Funktion erhalten kann?

double OldTicketSell()// Ermittlung des am weitesten entfernten Verkaufsauftrags

{
double MaxDist=0,oldprofit,lot;
int ticket=0;
double BID=MarketInfo(Symbol(),MODE_BID);
double ASK=MarketInfo(Symbol(),MODE_ASK);
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==OP_SELL && MaxDist<MathAbs(OrderOpenPrice()-ASK))
{
MaxDist=MathAbs(OrderOpenPrice()-ASK);
ticket=OrderTicket();
alter Gewinn = OrderProfit();
lot = OrderLots();
}
}
}
zurück(ticket);

}

Die Funktion ist klar, es ist nicht klar, wie man die gefundenen Daten aus ihr herausbekommt, oder es ist notwendig, sie unter Los und Gewinn zu kopieren.


 
Николай:

Guten Abend, könnten Sie mir bitte sagen, wie ich Ticketbestellungen, Lot und Profit in einer Funktion erhalten kann.

Die Funktion ist verständlich, es ist nicht klar, wie man die gefundenen Daten daraus zieht, oder soll ich sie unter Los und Gewinn kopieren.

Wir könnten es so machen

struct InfoOrder
{
     int ticket;
     double lot,
            profit,
            swap,
            commission,
            sl, tp;
     datetime timeOpen;
     string comment;
} infoOrder;

void OldSell(void)// Находим самый дальний ордер на продажу
{
   double MaxDist=0;
   double BID=MarketInfo(Symbol(),MODE_BID);
   double ASK=MarketInfo(Symbol(),MODE_ASK);
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_SELL && MaxDist<MathAbs(OrderOpenPrice()-ASK))
         {
             MaxDist=MathAbs(OrderOpenPrice()-ASK);
             infoOrder.ticket=OrderTicket();
             infoOrder.profit = OrderProfit();
             infoOrder.lot = OrderLots();
         }
      }
   }
   return; 
}
 
Konstantin Nikitin:

Sie können so vorgehen

Es ist alles gut, aber ich bin ein Dummy, ich versuche, einen EA in den Umfang meines Wissens zu schreiben (ich habe gerade gelernt, ein bisschen), ich verstehe, dass die Variable eine Struktur ist, aber wie man Daten aus dieser Struktur zu bekommen ist nicht klar. Wenn wir zum Beispiel den am weitesten entfernten Auftrag gefunden haben, dann sollte der Gewinn durch Lots geteilt werden, und wir erhalten die Anzahl der Punkte vom aktuellen Preis bis zum Lot. Dann erhalten wir den Gewinn eines entgegengesetzten Auftrags (ich weiß, wie man ihn erhält), teilen ihn durch die zuvor berechnete Anzahl der Punkte des entgegengesetzten Auftrags, erhalten die Anzahl der Lots und verwenden diese Anzahl der Lots, um den gefundenen fernen Auftrag ganz oder teilweise zu schließen.
 
Konstantin Nikitin:

Wir könnten es so machen

Ich möchte auch fragen, ob es möglich ist, den Auftrag zu finden, der am weitesten vom Preis entfernt ist, indem man die Eröffnungspreise der Aufträge im Zyklus vergleicht; ich denke, das wäre noch einfacher.

 
Николай:

Ich möchte auch fragen, ob es möglich ist, den Auftrag zu finden, der am weitesten vom Preis entfernt ist, indem man die Eröffnungspreise der Aufträge im Zyklus vergleicht; ich denke, das wäre noch einfacher.

Natürlich ist sie das. Und ob es einfacher ist oder nicht, hängt davon ab, was Sie brauchen.
Hier ist ein Beispiel zu Ihrer Frage oben.

struct InfoOrder
{
     int ticket;
     double lot,
            profit,
            swap,
            commission,
            sl, tp;
     datetime timeOpen;
     string comment;
} infoOrder;

void OnTick()
{
     OldSell();
     Print("Ticket: ", infoOrder.ticket);
     Print("Profit: ", infoOrder.profit);
     Print("Lot: ", infoOrder.lot);
     Print("-----=====-----");
     
     return;
}

void OldSell(void)// Находим самый дальний ордер на продажу
{
   double MaxDist=0;
   double BID=MarketInfo(Symbol(),MODE_BID);
   double ASK=MarketInfo(Symbol(),MODE_ASK);
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderType()==OP_SELL && MaxDist<MathAbs(OrderOpenPrice()-ASK))
         {
             MaxDist=MathAbs(OrderOpenPrice()-ASK);
             infoOrder.ticket=OrderTicket();
             infoOrder.profit = OrderProfit();
             infoOrder.lot = OrderLots();
         }
      }
   }
   return; 
}
 
Konstantin Nikitin:

Natürlich können Sie das. Ob es einfacher ist oder nicht, hängt davon ab, was Sie brauchen.
Und ein Beispiel zu Ihrer obigen Frage.

Wenn ich mir das alles ansehe, wird mir klar, was für ein Tippgeber ich bin. Sowird dasErgebnis derFunktionvoid OldSell(void) in die StrukturInfoOrder geschrieben und dann können Sie die Variablen infoOrder.ticket,infoOrder.profit,infoOrder.lot verwenden.
//-Структура для нахождения самого дальнего ордера на продажу
struct InfoOrder
{
     int ticket;
     double lot,
            profit,
            swap,
            commission,
            sl, tp;
     datetime timeOpen;
     string comment;
} infoOrder;

void OnTick()
{
     OldSell();
     Print("Ticketbuy: ", infoOrder.ticket);
     Print("Profitbuy: ", infoOrder.profit);
     Print("Lotbuy: ", infoOrder.lot);
     Print("Ticketsell: ", infoOrder.ticket);
     Print("Profitsell: ", infoOrder.profit);
     Print("Lotsell: ", infoOrder.lot);
     Print("-----=====-----");
     
     return;
}

void OldSell(void)// Находим самый дальний ордер на продажу
{
   double MaxDist=0;
   double BID=MarketInfo(Symbol(),MODE_BID);
   double ASK=MarketInfo(Symbol(),MODE_ASK);
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderType()==OP_BUY && MaxDist<MathAbs(OrderOpenPrice()-BID))
          {
             MaxDist=MathAbs(OrderOpenPrice()-BID);
             infoOrder.ticketbuy=OrderTicket();
             infoOrder.profitbuy = OrderProfit();
             infoOrder.lotbuy = OrderLots();
           }  
             
        if(OrderType()==OP_SELL && MaxDist<MathAbs(OrderOpenPrice()-ASK))
          {
             MaxDist=MathAbs(OrderOpenPrice()-ASK);
             infoOrder.ticketsell=OrderTicket();
             infoOrder.profitsell = OrderProfit();
             infoOrder.lotsell = OrderLots();
          }
      }
   }
   return; 
}


 
Konstantin Nikitin:

Natürlich können Sie das. Ob es einfacher ist oder nicht, hängt davon ab, was Sie brauchen.
Und ein Beispiel zu Ihrer obigen Frage.

Vergessen, die Druckvariablen zu ändern
 
Николай:
Wenn ich mir das alles ansehe, wird mir klar, was für ein Dummkopf ich bin. Also, dasErgebnis dervoid OldSell(void)-Funktion wird in dieInfoOrder-Struktur geschrieben und dann können wir infoOrder.ticket,infoOrder.profit,infoOrder.lot verwenden.
//-Структура для нахождения самого дальнего ордера на продажу
struct InfoOrder
{
     int ticket;
     double lot,
            profit,
            swap,
            commission,
            sl, tp,
            MaxDist;
     datetime timeOpen;
     string comment;
} infoOrder;

void OnTick()
{
     if( OldOrder(OP_BUY) )
     {
        Print("Ticketbuy: ", infoOrder.ticket);
        Print("Profitbuy: ", infoOrder.profit);
        Print("Lotbuy: ", infoOrder.lot);
        Print("MaxDistbuy: ", infoOrder.MaxDist);
        Print("-----=====-----");
     }
     if( OldOrder(OP_SELL) )
     {
        Print("Ticketsell: ", infoOrder.ticket);
        Print("Profitsell: ", infoOrder.profit);
        Print("Lotsell: ", infoOrder.lot);
        Print("MaxDistsell: ", infoOrder.MaxDist);
        Print("-----=====-----");
     }
     
     return;
}

bool OldOrder(const int type)// Находим самый дальний ордер на продажу
{
   bool res = false;
   double MaxDist=0;
   double BID=MarketInfo(Symbol(),MODE_BID);
   double ASK=MarketInfo(Symbol(),MODE_ASK);
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         switch(type)
           {
            case OP_BUY:
               if(OrderType()!=OP_BUY) break;
               if(MaxDist<=MathAbs(OrderOpenPrice()-BID)) break;
               infoOrder.MaxDist=MathAbs(OrderOpenPrice()-BID);
               infoOrder.ticket=OrderTicket();
               infoOrder.profit = OrderProfit();
               infoOrder.lot = OrderLots();
               res = true;
               break;
             
           case OP_SELL:
               if(OrderType()!=OP_SELL) break;
               if(MaxDist>=MathAbs(OrderOpenPrice()-ASK)) break;
               infoOrder.MaxDist=MathAbs(OrderOpenPrice()-ASK);
               infoOrder.ticket=OrderTicket();
               infoOrder.profit = OrderProfit();
               infoOrder.lot = OrderLots();
               res = true;
               break;
        }
      }
   }
   return res; 
}

Etwa so.
 




Ich habe diese Struktur in der EA gefunden. Können Sie mir sagen, was sie definiert?

struct TMartinData
{
   int    BUY_Positions;
   double BUY_LastPrice;
   double BUY_StopPrice;
   double BUY_Lots;
   datetime BUY_LastTime;
   bool   BUY_AllWD;
   int    SELL_Positions;
   double SELL_LastPrice;
   double SELL_StopPrice;
   double SELL_Lots;
   datetime SELL_LastTime;
   bool   SELL_AllWD;
} MartinData;

void OnTick()

void FillMartinData()
{
   datetime bfirst = TimeCurrent()+1;
   datetime blast = 0;
   datetime sfirst = TimeCurrent()+1;
   datetime slast = 0;
   MartinData.BUY_Positions = 0;
   MartinData.SELL_Positions = 0;
   MartinData.BUY_Lots = 0;
   MartinData.SELL_Lots = 0;
   MartinData.BUY_LastPrice = -1;
   MartinData.SELL_LastPrice = -1;
   MartinData.BUY_StopPrice = -1;
   MartinData.SELL_StopPrice = -1;
   MartinData.BUY_LastTime = 0;
   MartinData.SELL_LastTime = 0;
   MartinData.BUY_AllWD = true;
   MartinData.SELL_AllWD = true;
   for(int i=0;i<OrdersTotal();i++)
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNum)
     {
        if (OrderType()==OP_BUY)
        {
           MartinData.BUY_Positions++;
           if (OrderOpenTime()<bfirst)
           {
              MartinData.BUY_Lots = OrderLots();
              MartinData.BUY_StopPrice = OrderStopLoss();
              bfirst = OrderOpenTime();
           }
           if (OrderOpenTime()>blast)
           {
              MartinData.BUY_LastPrice = OrderOpenPrice();
              blast = OrderOpenTime();
           }
           if (OrderStopLoss()<OrderOpenPrice())
              MartinData.BUY_AllWD = false;
        }
        else if (OrderType()==OP_SELL)
        {
           MartinData.SELL_Positions++;
           if (OrderOpenTime()<sfirst)
           {
              MartinData.SELL_Lots = OrderLots();
              MartinData.SELL_StopPrice = OrderStopLoss();
              sfirst = OrderOpenTime();
           }
           if (OrderOpenTime()>slast)
           {
              MartinData.SELL_LastPrice = OrderOpenPrice();
              slast = OrderOpenTime();
           }
           if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
              MartinData.SELL_AllWD = false;
        }
     }
   }
   MartinData.BUY_LastTime = blast;
   MartinData.SELL_LastTime = slast;
   if (MartinData.BUY_Positions==0) MartinData.BUY_AllWD = false;
   if (MartinData.SELL_Positions==0) MartinData.SELL_AllWD = false;
}


Grund der Beschwerde: