Wie programmiert man? - Seite 324

 
mladen:
Nicht so einfach zu erklären

Sie müssen ein Ereignis an den Offline-Chart senden, das ihm (von Ihrem Indikator) "mitteilt", dass ein neuer Tick erzeugt wurde und dass er die erforderlichen Routinen ausführen soll. Das bedeutet die Verwendung von Low-Level-Funktionen. Das Ganze kann etwa so aussehen:

#include

#import "user32.dll"

int GetParent(int hWnd);

#import

#define CHART_CMD_UPDATE_DATA 33324

void UpdateChartWindows()

{

int filePeriod = 1; // file period

string fileSymbol = "your offline symbol name";

string chartName = "your offline symbol chart full name";

string stringForName = " ";

//

//

//

//

//

int windowHandle = WindowHandle(fileSymbol,filePeriod);

if (windowHandle != 0)

{

windowHandle = GetParent(windowHandle);

windowHandle = GetWindow(windowHandle,GW_HWNDFIRST);

while (windowHandle != 0)

{

int len = GetWindowTextA(windowHandle,stringForName,80);

if (len > 0 && StringSubstr(stringForName,0,len) == chartName)

PostMessageA(windowHandle,WM_COMMAND,CHART_CMD_UPDATE_DATA,0);

windowHandle = GetWindow(windowHandle,GW_HWNDNEXT);

}

}

}

Danke, ich werde es prüfen. Allerdings finde ich das Problem für sendorder richtig. Mein Indikator erstellt einen Namen für den Offline-Chart, der nicht dem Standard entspricht und die Plattformen öffnen ihn aus diesem Grund nicht.

Vielen Dank für Ihre Bereitschaft

 

Ok, das Problem mit der Offline-Tabelle ist gelöst.

Ich habe ein anderes Problem.

Ich habe einen Indikator zu erstellen, dass die Volumina mit bestimmten Regeln zu berechnen.

Was ich brauche, ist, dass jedes Mal, wenn es eine Veränderung der Tick der Indikator muss die Länge der Schaukel zu zählen.

Beispiel.

auf Open Kerze der Wert Puffer ist 0. So muss es zählen alle Tick getan, bevor ein Retracement, aber der ultimative Wert zurückgegeben wird, ist der höchste davon seit der Kerze schließen.

Nach, es muss die Farbe des Histogramms reletated die movemenet getan des höchsten Bereichs aus dem Puffer zurückgegeben gesetzt.

Ich versuche auf verschiedene Art und Weise, aber keine succes.

Heeeeelp ^^.

Dankeschön

 

Vielen Dank für all Ihre Unterstützung. Ich lerne mehr und mit all eurer Hilfe habe ich alle meine Probleme gelöst...ABER.

Ich habe eine andere^^.

Ich muss eine ungültige Funktion für den Rückruf erstellen, und es muss die Verschmelzung dieser beiden Codes sein.

Der erste findet die letzte offene Bestellung und der zweite findet die Anzahl der offenen Bestellungen, die einen höheren Openprice haben.

Ich muss eine Funktion für haben direkt die Anzahl der Bestellung, die die höchste openorderprice haben zu tun.

Dankeschön

for(int i = OrdersTotal()-1; i>= 0; i--) {

OrderSelect(i, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType() == TYPE ) {

if(TYPE == OP_BUY) {

double OPrice = OrderOpenPrice();[/PHP]

[PHP]for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>test(OP_BUY) Hbuys++;

}

}

}

return(Hbuys);

}

 
dasio:
Vielen Dank für all Ihre Unterstützung. Ich lerne mehr und mit all eurer Hilfe habe ich alle meine Anfragen gelöst...ABER.

Ich habe eine andere^^.

Ich muss eine ungültige Funktion aufrufen, und es muss die Verschmelzung dieser beiden Codes sein.

Die erste findet die letzte openorder. und die zweite findet die Anzahl der openorder, die den openprice höher haben.

Ich muss eine Funktion für haben direkt die Anzahl der Bestellung, die die höchste openorderprice haben zu tun.

Dankeschön

for(int i = OrdersTotal()-1; i>= 0; i--) {

OrderSelect(i, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType() == TYPE ) {

if(TYPE == OP_BUY) {

double OPrice = OrderOpenPrice();[/PHP]

for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>test(OP_BUY) Hbuys++;

}

}

}

return(Hbuys);

}

Ich habe einen Fehler im zweiten Code. Es ist richtig

[PHP]for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>OPrice Hbuys++;

}

}

}

return(Hbuys);

}

 

dasio

void function ist eine Funktion, die keinen Wert zurückgibt. Wenn das der Fall ist, dann ist der einzige vernünftige Weg, dies zu tun, eine Variable zu verwenden, die als Referenz an die Funktion übergeben wird (meiner Erfahrung nach ist die Verwendung von Variablen mit globalem Gültigkeitsbereich für diesen Zweck eine sehr schlechte Praxis - sie umgeht strukturierte Codierungsregeln, und in Fällen, in denen nach Fehlern gesucht werden muss, ist es ein Alptraum, wenn solche Variablen verwendet werden). Ist es das, was Sie im Sinn hatten?

dasio:
Ich habe einen Fehler im zweiten Code gemacht. Es ist richtig
for(int e=0;e<OrdersTotal();e++) {

if(OrderSelect(e,SELECT_BY_POS,MODE_TRADES)==false ) break;

if(OrderSymbol() == Symbol() && OrderType() == TYPE) {

if(TYPE == OP_BUY) {

if(OrderOpenPrice()>OPrice Hbuys++;

}

}

}

return(Hbuys);

}

 
mladen:
dasio void-Funktion ist eine Funktion, die keinen Wert zurückgibt. Wenn das der Fall ist, dann ist der einzige vernünftige Weg, dies zu tun, eine Variable zu verwenden, die als Referenz an die Funktion übergeben wird (meiner Erfahrung nach ist die Verwendung von Variablen mit globalem Gültigkeitsbereich für diesen Zweck eine sehr schlechte Praxis - sie umgeht strukturierte Codierungsregeln, und in Fällen, in denen nach Fehlern gesucht werden muss, ist es ein Alptraum, wenn solche Variablen verwendet werden). Ist es das, was Sie im Sinn hatten?

Ich danke Ihnen für Ihre Antwort,

Ich brauche nur die Anzahl der Käufe, die den höchsten Openorder und den niedrigsten Openorderm haben, bezogen auf den letzten geöffneten Kaufauftrag.

Ich muss das Ergebnis, wie moltiplier in eine vois-Funktion für einige Kontrolle verwenden.

So ist es viel einfacher, diesen Datensatz auf Anfrage abzurufen. Vielleicht auf diese Weise kann ich es einfach CalculateCurrentBuy(Symbol()) abrufen.

int CalculateHighestbuy(string symbol) {

int Hopen=0;

for(int i=0;i<OrdersTotal();i++) {

code here

}

}

return(Hopen);

}

 

Nachlaufgitter?

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){

OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Ask-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){

OrderSend(Symbol(),OP_BUYSTOP,Buy.Lots+i*Buy.Multiplier,Bid+i*(Trail.BUYSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

}[/CODE]

I can set a grid using the above code but how do I get the Buy Grid and Sell grid grid to trail independently or as a set and retain the separate grid spacing? I have tried all sorts of things and must be missing something obvious. All I get is either all the pending orders move to the same level and then trail as a group or the pending orders start moving up and down with the price action.

[CODE] void TrailingOrders() {

if (Trail.BUYSTOP.Orders && OrderType()==OP_BUYSTOP) {

if (OrderOpenPrice()-Ask>(Trail.BUYSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Ask+OrderOpenPrice()+(Trail.BUYSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Aqua);

}

}

if (Trail.SELLSTOP.Orders && OrderType()==OP_SELLSTOP) {

if (Bid-OrderOpenPrice()>(Trail.SELLSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Bid-OrderOpenPrice()-(Trail.SELLSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Yellow);

}

}

}

Dieser Code wird 2 Aufträge verfolgen, aber wie kann ich es ändern, um mehr zu verfolgen? Sobald ich versuche, den Trailing-Code für mehrere Ebenen einzurichten, wie der obige Gittercode, wird er zu Pudding.

Jeder Einblick würde geschätzt werden.

Mit freundlichen Grüßen CJA

 

...

cja

Ich habe es mit folgendem Code versucht und es funktioniert gut (siehe Beispielbild: verschiedene Schritte wurden bereits angewendet)

Ich wusste nicht, wofür die Variablen s.ticketP und b.ticketP gedacht sind, also habe ich sie so verwendet, wie Sie es im Code sehen können

extern double Trail.SELLSTOP.Orders.Distance = 15;

extern double Trail.BUYSTOP.Orders.Distance = 20;

extern int Stop.Order.Levels = 4;

extern double Sell.Lots = 0.1;

extern double Sell.Multiplier = 0.1;

extern double Buy.Lots = 0.1;

extern double Buy.Multiplier = 0.2;

extern bool Set.SELLSTOP = true;

extern bool Set.BUYSTOP = true;

int init()

{

return(0);

}

int start()

{

double myPoint=1; if (Digits==3 || Digits==5) myPoint=10; myPoint *= Point;

static int s.ticketP=0;

static int b.ticketP=0;

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){ OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Bid-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){ OrderSend(Symbol(),OP_BUYSTOP ,Buy.Lots+i *Buy.Multiplier ,Ask+i*(Trail.BUYSTOP.Orders.Distance)*myPoint ,0,0,0,0,0,0,CLR_NONE);}

}

s.ticketP=Stop.Order.Levels;

b.ticketP=Stop.Order.Levels;

return(0);

}

cja:
for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){

OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Ask-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){

OrderSend(Symbol(),OP_BUYSTOP,Buy.Lots+i*Buy.Multiplier,Bid+i*(Trail.BUYSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

}[/CODE]

I can set a grid using the above code but how do I get the Buy Grid and Sell grid grid to trail independently or as a set and retain the separate grid spacing? I have tried all sorts of things and must be missing something obvious. All I get is either all the pending orders move to the same level and then trail as a group or the pending orders start moving up and down with the price action.

[CODE] void TrailingOrders() {

if (Trail.BUYSTOP.Orders && OrderType()==OP_BUYSTOP) {

if (OrderOpenPrice()-Ask>(Trail.BUYSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Ask+OrderOpenPrice()+(Trail.BUYSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Aqua);

}

}

if (Trail.SELLSTOP.Orders && OrderType()==OP_SELLSTOP) {

if (Bid-OrderOpenPrice()>(Trail.SELLSTOP.Orders.Distance)*myPoint) {

OrderModify(OrderTicket(),Bid-OrderOpenPrice()-(Trail.SELLSTOP.Orders.Distance)*myPoint,OrderStopLoss(),OrderTakeProfit(), 0, Yellow);

}

}

}

Dieser Code verfolgt 2 Bestellungen, aber wie kann ich ihn ändern, um mehr zu verfolgen? Sobald ich versuche, den Trailing-Code für mehrere Ebenen wie den obigen Grid-Code einzurichten, wird er zu Pudding.

Jeder Einblick würde geschätzt werden.

Mit freundlichen Grüßen CJA
Dateien:
stopd.gif  36 kb
 

Nachlaufendes Raster

mladen:
cja

Ich habe es mit dem folgenden Code versucht und es funktioniert gut (siehe das Beispielbild: verschiedene Schritte wurden bereits angewendet)

Ich wusste nicht, wofür die Variablen s.ticketP und b.ticketP gedacht sind, also habe ich sie so verwendet, wie man es im Code sehen kann

extern double Trail.SELLSTOP.Orders.Distance = 15;

extern double Trail.BUYSTOP.Orders.Distance = 20;

extern int Stop.Order.Levels = 4;

extern double Sell.Lots = 0.1;

extern double Sell.Multiplier = 0.1;

extern double Buy.Lots = 0.1;

extern double Buy.Multiplier = 0.2;

extern bool Set.SELLSTOP = true;

extern bool Set.BUYSTOP = true;

int init()

{

return(0);

}

int start()

{

double myPoint=1; if (Digits==3 || Digits==5) myPoint=10; myPoint *= Point;

static int s.ticketP=0;

static int b.ticketP=0;

for(int i = 1; i < Stop.Order.Levels+1; i++)

{

if(Set.SELLSTOP && s.ticketP==0){ OrderSend(Symbol(),OP_SELLSTOP,Sell.Lots+i*Sell.Multiplier,Bid-i*(Trail.SELLSTOP.Orders.Distance)*myPoint,0,0,0,0,0,0,CLR_NONE);}

if(Set.BUYSTOP && b.ticketP==0){ OrderSend(Symbol(),OP_BUYSTOP ,Buy.Lots+i *Buy.Multiplier ,Ask+i*(Trail.BUYSTOP.Orders.Distance)*myPoint ,0,0,0,0,0,0,CLR_NONE);}

}

s.ticketP=Stop.Order.Levels;

b.ticketP=Stop.Order.Levels;

return(0);

}

Hallo mladen,

danke für deine Hilfe, aber vielleicht habe ich mich in meinem obigen Beitrag nicht ganz klar ausgedrückt. Ich habe kein Problem damit, ein Raster zu setzen, das Problem, das ich habe, ist das Nachziehen des Rasters, ohne die Trennung der Reihenfolge zu verlieren.

s.ticketP & b.ticketP beziehen sich einfach auf den BUYSTOP & SELLSTOP Code für schwebende Aufträge, der an anderer Stelle im EA verwendet wird.

Mit freundlichen Grüßen CJA

 

Schleppendes Gitter

cja:
Hallo mladen,

Vielen Dank für Ihre Hilfe, aber vielleicht habe ich mich in meinem obigen Beitrag nicht ganz klar ausgedrückt. Ich habe kein Problem damit, ein Raster zu setzen, das Problem, das ich habe, ist das Nachziehen des Rasters, ohne die Auftragstrennung zu verlieren.

s.ticketP & b.ticketP beziehen sich einfach auf den BUYSTOP & SELLSTOP Pending Order Code, der an anderer Stelle im EA verwendet wird.

mit freundlichen Grüßen CJA

Hallo mladen,

Haben Sie Zeit, sich das einmal anzusehen?

Mit freundlichen Grüßen CJA