Libraryless. Click here for Pure Java version (29438L/184K).
concept RunnerTradingAlgorithm extends G22TradingStrategy { settableWithVar int minRun = 5; settableWithVar int bet; // direction: -1 or 1 for normal short or long // To change size of of position, use -2, 2 etc Position openPosition(int direction) { if (direction == 0) null; new Position p; p.marginToUse = marginPerPosition*abs(direction); ret openPosition(p, direction); } void start { if (started()) fail("Already started"); if (currentPrice() == 0) ret with primed(true); // Save starting price, create price cells & digitizer startingPrice = currentPrice(); startTime = currentTime(); var priceCells = makePriceCells(startingPrice); print("Made price cells: " + priceCells); digitizer = new PriceDigitizer2(priceCells); digitizer.verbose(verbose); //digitizer.init(startingPrice); log("Starting RUNNER at " + startingPrice + " +/- " + cellSize + ", min run: " + minRun); } void price(double price) { if (currentPrice == price) ret; currentPrice = price; if (hasClosedItself()) ret; if (!started()) { if (primed) { primed(false); start(); } else ret; } digitizer.digitize(price); direction = sign(digitizedPrice()-lastDigitizedPrice()); // No cell move? if (direction == 0) ret with afterStep(); nextStep(); //printWithPrecedingNL("New digitized price: " + digitizedPrice()); if (started()) step(); print(this); } swappable void step { double p1 = lastDigitizedPrice(); double p2 = digitizedPrice(); direction = sign(p2-p1); if (direction == 0) ret; bet = makeBet(); applyBet(); } swappable void applyBet { double drift = drift(); if (sign(drift) != sign(bet)) { closeAllPositions(); openPosition(bet); } log(renderVars(+stepCount, +drift, +bet, +lastDirection, +direction, +run, +minRun, +longestRunSeen)); afterStep(); } double currentCellNumber() { ret toCellNumber(currentPrice()); } // Cell we're in int currentDigitizedCell() { ret iround(toCellNumber(digitizedPrice())); } int priceDirection() { ret sign(currentCellNumber()-currentDigitizedCell()); } // Cell we're currently moving to int targetCell() { ret currentDigitizedCell()+priceDirection(); } double targetPrice() { ret fromCellNumber(targetCell()); } // Coin profit when next target is reached double targetProfit() { ret coinProfitAtPrice(targetPrice()); } // Is profit currently going up or down int profitDirection() { ret sign(targetProfit()-coinProfit()); } // progress to next target in percent double progressInProfitDirection() { ret absDiff(currentCellNumber(), currentDigitizedCell())*100; } settableWithVar int lastDirection; settableWithVar int move; settableWithVar int run; settableWithVar int longestRunSeen; S fieldsToReset() { ret lines(ll(super.fieldsToReset(), [[lastDirection run bet longestRunSeen move]])); } swappable int makeBet() { move(direction); if (direction == lastDirection) ++run; else run = 1; longestRunSeen(max(longestRunSeen, run)); if (run >= minRun) bet = direction; if (bet != 0 && direction != bet) bet = 0; lastDirection = direction; ret bet; } }
Began life as a copy of #1036196
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1036402 |
Snippet name: | RunnerTradingAlgorithm |
Eternal ID of this version: | #1036402/9 |
Text MD5: | dcf05195df8a81c78d5f5f541812e0b5 |
Transpilation MD5: | a133f5e629de6cb5b909249c313039e1 |
Author: | stefan |
Category: | javax / gazelle 22 |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-12-08 04:07:54 |
Source code size: | 3574 bytes / 140 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 142 / 235 |
Version history: | 8 change(s) |
Referenced in: | #1003674 - Standard Classes + Interfaces (LIVE continued in #1034167) |