Plugin Directory

Changeset 3346660


Ignore:
Timestamp:
08/18/2025 10:00:46 PM (7 months ago)
Author:
laith3
Message:

Release 1.2.0: NT8.1+ CSV support, runner handling, merge policy (minute/tolerance), disable merge in Free

Location:
tradejournal/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • tradejournal/trunk/includes/csv-import.php

    r3205179 r3346660  
    5050    $post_id = wp_insert_post($post_data);
    5151
    52     // Check if "Merge Accounts" is enabled
    53     $merge_accounts = get_option('tradejournal_merge_accounts', 0);
    54 
    5552    if ($post_id) {
    5653        $trade_data = [];
    5754
    58         // Process each row and merge trades if necessary
    59         foreach ($csv_data as $index => $row) {
    60             if ($index == 0) continue; // Skip header row
    61 
    62             $trade = array_combine($headers, $row);
    63 
    64             $instrument = isset($trade['instrument']) ? esc_html($trade['instrument']) : '';
    65             $account = isset($trade['account']) ? explode('!', $trade['account'])[0] : '';
    66 
    67 
    68             $entry_time = isset($trade['entry time']) ? esc_html($trade['entry time']) : '';
    69 
    70             // Extract only the time part (e.g., '2:30 PM' from '2024-10-02 14:30')
    71             if (!empty($entry_time)) {
    72                 $timestamp = strtotime($entry_time); // Convert to timestamp
    73                 $entry_time = gmdate('g:i A', $timestamp); // Format to 12-hour time with AM/PM
    74             }
    75 
    76 
    77             $qty = isset($trade['qty']) ? intval($trade['qty']) : 1;
    78             $entry_price = isset($trade['entry price']) ? floatval($trade['entry price']) : 0;
    79             $exit_price = isset($trade['exit price']) ? floatval($trade['exit price']) : 0;
    80             $side = isset($trade['market pos.']) ? strtolower($trade['market pos.']) : '';
    81 
    82             // Retrieve instrument settings from plugin options
    83             $multipliers_and_commissions = get_option('tradejournal_instrument_multipliers', []);
    84 
    85             // Default to empty array if settings are not found
    86             if (empty($multipliers_and_commissions)) {
    87                 $multipliers_and_commissions = [
    88                     'ES' => ['multiplier' => 50, 'commission' => 5],
    89                     'MES' => ['multiplier' => 5, 'commission' => 0.5],
    90                 ];
    91             }
    92 
    93             // Set instrument multiplier and commission dynamically
    94             $multiplier = 1; // Default multiplier
    95             $commission = 0; // Default commission
    96 
    97             foreach ($multipliers_and_commissions as $key => $values) {
    98                 if (strpos($instrument, $key) === 0) {
    99                     $multiplier = $values['multiplier'];
    100                     $commission = $values['commission'];
     55        // Normalize headers to lowercase/trim
     56        $headers = array_map(function ($h) {
     57            return strtolower(trim((string)$h));
     58        }, $csv_data[0] ?? []);
     59        $rows    = array_slice($csv_data, 1);
     60
     61        // Helper: safe row map by header name
     62        $map_row = function (array $headers, array $row) {
     63            $out = [];
     64            foreach ($headers as $i => $h) {
     65                $out[$h] = isset($row[$i]) ? trim((string)$row[$i]) : '';
     66            }
     67            return $out;
     68        };
     69
     70        // Detect formats
     71        $has_ex_flag   = in_array('e/x', $headers, true); // NT8 split row format
     72        $has_entry_col = in_array('entry time', $headers, true); // summary/combined format
     73
     74        // Merge behavior
     75        // Merge behavior
     76        $merge_accounts = (int) get_option('tradejournal_merge_accounts', 0);
     77        // If the Free version flag is present anywhere in the runtime, force disable merging
     78        if (defined('TJWP_FREE_VERSION') && TJWP_FREE_VERSION) {
     79            $merge_accounts = 0;
     80        }
     81        $merge_time_tolerance   = (int) get_option('tradejournal_merge_time_tolerance', 10); // seconds
     82        $merge_round_to_minute  = (int) get_option('tradejournal_merge_round_to_minute', 0);  // 1 = round to minute
     83
     84        // Instrument settings (fallback defaults)
     85        $instrument_opts = get_option('tradejournal_instrument_multipliers', []);
     86        if (empty($instrument_opts)) {
     87            $instrument_opts = [
     88                'ES'  => ['multiplier' => 50, 'commission' => 5],
     89                'MES' => ['multiplier' => 5,  'commission' => 0.5],
     90                'NQ'  => ['multiplier' => 20, 'commission' => 5],
     91                'MNQ' => ['multiplier' => 2,  'commission' => 0.5],
     92            ];
     93        }
     94        $get_mult_comm = function ($instrument) use ($instrument_opts) {
     95            $mult = 1.0;
     96            $comm = 0.0;
     97            foreach ($instrument_opts as $sym => $vals) {
     98                if (stripos($instrument, $sym) === 0) {
     99                    $mult = isset($vals['multiplier']) ? (float)$vals['multiplier'] : $mult;
     100                    $comm = isset($vals['commission']) ? (float)$vals['commission'] : $comm;
    101101                    break;
    102102                }
    103103            }
    104 
    105             // Calculate P&L based on side, multiplier, and subtract commission
    106             $pnl = 0;
    107             if ($entry_price && $exit_price) {
    108                 if ($side === 'long') {
    109                     $pnl = ($exit_price - $entry_price) * $qty * $multiplier;
    110                 } elseif ($side === 'short') {
    111                     $pnl = ($entry_price - $exit_price) * $qty * $multiplier;
    112                 }
    113                 // Subtract commission
    114                 $pnl -= $commission;
    115                 $pnl = number_format($pnl, 2);
    116             }
    117 
    118             // Check if we should merge accounts
    119             if ($merge_accounts == 1 && !defined('TJWP_FREE_VERSION')) {
    120                 $found_match = false;
    121                 foreach ($trade_data as &$existing_trade) {
    122                     if ($existing_trade['Instrument'] === $instrument && $existing_trade['Entry Time'] === $entry_time) {
    123                         // Merge accounts, qty, and P&L
    124                         $existing_accounts = explode(', ', $existing_trade['Account']);
    125                         if (!in_array($account, $existing_accounts)) {
    126                             $existing_accounts[] = $account;
    127                         }
    128 
    129                         // Remove duplicates and sort accounts alphabetically
    130                         $existing_accounts = array_unique($existing_accounts);
    131                         sort($existing_accounts);
    132 
    133                         // Join accounts back into a string
    134                         $existing_trade['Account'] = implode(', ', $existing_accounts);
    135 
    136                         $existing_trade['Qty'] += $qty;
    137                         $existing_trade['P&L'] += $pnl;
    138                         $found_match = true;
     104            return [$mult, $comm];
     105        };
     106
     107        // Common helpers
     108        $fmt_time = function ($ts) {
     109            return date('g:i:s A', (int)$ts);
     110        };
     111        $floor_min = function ($ts) {
     112            $ts = (int)$ts;
     113            return $ts - ($ts % 60);
     114        };
     115
     116        // === Path A: NT8 split entry/exit (robust pairing with partials) ===
     117        if ($has_ex_flag) {
     118            $entries = [];
     119            $exits   = [];
     120
     121            foreach ($rows as $row) {
     122                if (!is_array($row) || empty($row)) continue;
     123                $g = $map_row($headers, $row);
     124
     125                $instrument = $g['instrument'] ?? '';
     126                if ($instrument === '') continue;
     127                $accountRaw = $g['account'] ?? '';
     128                $account    = $accountRaw ? explode('!', $accountRaw)[0] : '';
     129                if ($account === '') $account = $accountRaw;
     130
     131                $qty    = (int)($g['quantity'] ?? 0);
     132                $price  = (float)($g['price'] ?? 0);
     133                $action = strtolower($g['action'] ?? '');
     134                $flag   = strtolower($g['e/x'] ?? ''); // 'entry' or 'exit'
     135                $pos    = strtolower($g['position'] ?? '');
     136                $ts     = isset($g['time']) && $g['time'] !== '' ? strtotime($g['time']) : 0;
     137                if ($ts <= 0 || $qty <= 0) continue;
     138
     139                // Derive side
     140                $side = '';
     141                if ($flag === 'entry') {
     142                    $side = ($action === 'buy') ? 'long' : (($action === 'sell') ? 'short' : $side);
     143                    if ($side === '') $side = (strpos($pos, 'l') !== false) ? 'long' : ((strpos($pos, 's') !== false) ? 'short' : '');
     144                } elseif ($flag === 'exit') {
     145                    $side = ($action === 'sell') ? 'long' : (($action === 'buy') ? 'short' : $side);
     146                    if ($side === '') $side = (strpos($pos, 'l') !== false) ? 'long' : ((strpos($pos, 's') !== false) ? 'short' : '');
     147                }
     148                if ($side === '') continue;
     149
     150                if ($flag === 'entry') {
     151                    $entries[] = [
     152                        'Instrument'  => $instrument,
     153                        'Account'     => $account,
     154                        'Qty'         => $qty,
     155                        'Entry Price' => $price,
     156                        'ts'          => $ts,
     157                        'Side'        => $side,
     158                        'rem'         => $qty,
     159                    ];
     160                } elseif ($flag === 'exit') {
     161                    $exits[] = [
     162                        'Instrument' => $instrument,
     163                        'Account'    => $account,
     164                        'Qty'        => $qty,
     165                        'Exit Price' => $price,
     166                        'ts'         => $ts,
     167                        'Side'       => $side,
     168                        'rem'        => $qty,
     169                    ];
     170                }
     171            }
     172
     173            usort($entries, fn($a, $b) => $a['ts'] <=> $b['ts']);
     174            usort($exits,   fn($a, $b) => $a['ts'] <=> $b['ts']);
     175
     176            $slices = [];
     177            for ($ei = 0; $ei < count($entries); $ei++) {
     178                if (($entries[$ei]['rem'] ?? 0) <= 0) continue;
     179                for ($xi = 0; $xi < count($exits) && ($entries[$ei]['rem'] ?? 0) > 0; $xi++) {
     180                    if (($exits[$xi]['rem'] ?? 0) <= 0) continue;
     181                    $e = $entries[$ei];
     182                    $x = $exits[$xi];
     183                    if ($x['Instrument'] !== $e['Instrument'] || $x['Side'] !== $e['Side'] || $x['ts'] < $e['ts']) continue;
     184                    // Per-account pairing unless merge later
     185                    if (!$merge_accounts && ($x['Account'] !== $e['Account'])) continue;
     186                    $match = min((int)$e['rem'], (int)$x['rem']);
     187                    if ($match <= 0) continue;
     188
     189                    [$mult, $comm] = $get_mult_comm($e['Instrument']);
     190                    $pnl = 0.0;
     191                    if ($e['Side'] === 'long')  $pnl = ($x['Exit Price'] - $e['Entry Price']) * $match * $mult;
     192                    if ($e['Side'] === 'short') $pnl = ($e['Entry Price'] - $x['Exit Price']) * $match * $mult;
     193                    $pnl -= $comm * $match;
     194                    $pnl = round($pnl, 2);
     195
     196                    $slices[] = [
     197                        'Instrument'  => $e['Instrument'],
     198                        'Account'     => $e['Account'],
     199                        'Entry Time'  => $fmt_time($e['ts']),
     200                        'Exit Time'   => $fmt_time($x['ts']),
     201                        'EntryTS'     => $e['ts'],
     202                        'ExitTS'      => $x['ts'],
     203                        'Qty'         => $match,
     204                        'Entry Price' => (float)$e['Entry Price'],
     205                        'Exit Price'  => (float)$x['Exit Price'],
     206                        'P&L'         => $pnl,
     207                        'Side'        => $e['Side'],
     208                    ];
     209
     210                    $entries[$ei]['rem'] -= $match;
     211                    $exits[$xi]['rem']   -= $match;
     212                }
     213            }
     214
     215            // Merge across accounts if enabled
     216            if ($merge_accounts) {
     217                foreach ($slices as $rec) {
     218                    $found = false;
     219                    foreach ($trade_data as &$e2) {
     220                        // Ensure TS fields exist for comparison
     221                        if (!isset($e2['EntryTS']) && isset($e2['Entry Time'])) $e2['EntryTS'] = strtotime($e2['Entry Time']);
     222                        if (!isset($e2['ExitTS']) && isset($e2['Exit Time']))   $e2['ExitTS']  = strtotime($e2['Exit Time']);
     223
     224                        $same_instr  = ($e2['Instrument'] === $rec['Instrument']);
     225                        $same_side   = ($e2['Side'] === $rec['Side']);
     226                        $same_prices = ((float)$e2['Entry Price'] === (float)$rec['Entry Price'] && (float)$e2['Exit Price'] === (float)$rec['Exit Price']);
     227                        if (!$same_instr || !$same_side || !$same_prices) continue;
     228
     229                        if ($merge_round_to_minute) {
     230                            $close_entry = ($floor_min($e2['EntryTS']) === $floor_min($rec['EntryTS']));
     231                            $close_exit  = ($floor_min($e2['ExitTS'])  === $floor_min($rec['ExitTS']));
     232                        } else {
     233                            $tol = max(0, (int)$merge_time_tolerance);
     234                            $close_entry = (abs($e2['EntryTS'] - $rec['EntryTS']) <= $tol);
     235                            $close_exit  = (abs($e2['ExitTS']  - $rec['ExitTS'])  <= $tol);
     236                        }
     237                        if (!($close_entry && $close_exit)) continue;
     238
     239                        // Merge
     240                        $e2['Qty'] += $rec['Qty'];
     241                        $e2['P&L'] += $rec['P&L'];
     242                        if ($rec['EntryTS'] < $e2['EntryTS']) {
     243                            $e2['EntryTS'] = $rec['EntryTS'];
     244                            $e2['Entry Time'] = $rec['Entry Time'];
     245                        }
     246                        if ($rec['ExitTS']  > $e2['ExitTS']) {
     247                            $e2['ExitTS']  = $rec['ExitTS'];
     248                            $e2['Exit Time']  = $rec['Exit Time'];
     249                        }
     250                        // Accounts label
     251                        $accs = array_filter(array_map('trim', explode(', ', (string)($e2['Account'] ?? ''))));
     252                        if (!in_array($rec['Account'], $accs, true)) $accs[] = $rec['Account'];
     253                        $e2['Account'] = implode(', ', $accs);
     254                        $found = true;
    139255                        break;
    140256                    }
    141                 }
    142 
    143                 if (!$found_match) {
    144                     $trade_data[] = array(
    145                         'Instrument' => $instrument,
    146                         'Account' => $account,
    147                         'Entry Time' => $entry_time,
    148                         'Qty' => $qty,
    149                         'Entry Price' => $entry_price,
    150                         'Exit Price' => $exit_price,
    151                         'P&L' => $pnl,
    152                         'Side' => $side
    153                     );
     257                    unset($e2);
     258                    if (!$found) $trade_data[] = $rec;
    154259                }
    155260            } else {
    156                 // No merging, just add the trade
    157                 $trade_data[] = array(
    158                     'Instrument' => $instrument,
    159                     'Account' => $account,
    160                     'Entry Time' => $entry_time,
    161                     'Qty' => $qty,
    162                     'Entry Price' => $entry_price,
    163                     'Exit Price' => $exit_price,
    164                     'P&L' => $pnl,
    165                     'Side' => $side
    166                 );
     261                $trade_data = $slices; // per-account only
     262            }
     263        }
     264        // === Path B: Summary/combined rows already present ===
     265        elseif ($has_entry_col) {
     266            foreach ($rows as $row) {
     267                if (!is_array($row) || empty($row)) continue;
     268                $g = $map_row($headers, $row);
     269
     270                $instrument = $g['instrument'] ?? '';
     271                $accountRaw = $g['account'] ?? '';
     272                $account    = $accountRaw ? explode('!', $accountRaw)[0] : $accountRaw;
     273                $qty        = (int)($g['qty'] ?? ($g['quantity'] ?? 0));
     274                $entry_p    = (float)($g['entry price'] ?? 0);
     275                $exit_p     = (float)($g['exit price']  ?? 0);
     276                $side       = strtolower($g['market pos.'] ?? ($g['side'] ?? ''));
     277
     278                $entry_ts = isset($g['entry time']) && $g['entry time'] !== '' ? strtotime($g['entry time']) : 0;
     279                $exit_ts  = isset($g['exit time'])  && $g['exit time']  !== '' ? strtotime($g['exit time'])  : 0;
     280                if ($instrument === '' || $account === '' || $qty <= 0 || $entry_ts <= 0) continue;
     281
     282                [$mult, $comm] = $get_mult_comm($instrument);
     283                $pnl = 0.0;
     284                if ($entry_p && $exit_p) {
     285                    if ($side === 'long')  $pnl = ($exit_p - $entry_p) * $qty * $mult;
     286                    if ($side === 'short') $pnl = ($entry_p - $exit_p) * $qty * $mult;
     287                    $pnl -= $comm * $qty;
     288                    $pnl = round($pnl, 2);
     289                }
     290
     291                $rec = [
     292                    'Instrument'  => $instrument,
     293                    'Account'     => $account,
     294                    'Entry Time'  => $fmt_time($entry_ts),
     295                    'Exit Time'   => $exit_ts ? $fmt_time($exit_ts) : '',
     296                    'EntryTS'     => $entry_ts,
     297                    'ExitTS'      => $exit_ts,
     298                    'Qty'         => $qty,
     299                    'Entry Price' => (float)$entry_p,
     300                    'Exit Price'  => (float)$exit_p,
     301                    'P&L'         => $pnl,
     302                    'Side'        => $side,
     303                ];
     304
     305                if ($merge_accounts) {
     306                    $found = false;
     307                    foreach ($trade_data as &$e2) {
     308                        if (!isset($e2['EntryTS']) && isset($e2['Entry Time'])) $e2['EntryTS'] = strtotime($e2['Entry Time']);
     309                        if (!isset($e2['ExitTS']) && isset($e2['Exit Time']))   $e2['ExitTS']  = strtotime($e2['Exit Time']);
     310
     311                        $same_instr  = ($e2['Instrument'] === $rec['Instrument']);
     312                        $same_side   = ($e2['Side'] === $rec['Side']);
     313                        $same_prices = ((float)$e2['Entry Price'] === (float)$rec['Entry Price'] && (float)$e2['Exit Price'] === (float)$rec['Exit Price']);
     314                        if (!$same_instr || !$same_side || !$same_prices) continue;
     315
     316                        if ($merge_round_to_minute) {
     317                            $close_entry = ($floor_min($e2['EntryTS']) === $floor_min($rec['EntryTS']));
     318                            $close_exit  = ($floor_min($e2['ExitTS'])  === $floor_min($rec['ExitTS']));
     319                        } else {
     320                            $tol = max(0, (int)$merge_time_tolerance);
     321                            $close_entry = ($rec['EntryTS'] && $e2['EntryTS'] && abs($e2['EntryTS'] - $rec['EntryTS']) <= $tol);
     322                            $close_exit  = ($rec['ExitTS']  && $e2['ExitTS']  && abs($e2['ExitTS']  - $rec['ExitTS'])  <= $tol);
     323                        }
     324                        if (!($close_entry && $close_exit)) continue;
     325
     326                        $e2['Qty'] += $rec['Qty'];
     327                        $e2['P&L'] += $rec['P&L'];
     328                        if ($rec['EntryTS'] < $e2['EntryTS']) {
     329                            $e2['EntryTS'] = $rec['EntryTS'];
     330                            $e2['Entry Time'] = $rec['Entry Time'];
     331                        }
     332                        if ($rec['ExitTS']  > $e2['ExitTS']) {
     333                            $e2['ExitTS']  = $rec['ExitTS'];
     334                            $e2['Exit Time']  = $rec['Exit Time'];
     335                        }
     336                        $accs = array_filter(array_map('trim', explode(', ', (string)($e2['Account'] ?? ''))));
     337                        if (!in_array($rec['Account'], $accs, true)) $accs[] = $rec['Account'];
     338                        $e2['Account'] = implode(', ', $accs);
     339                        $found = true;
     340                        break;
     341                    }
     342                    unset($e2);
     343                    if (!$found) $trade_data[] = $rec;
     344                } else {
     345                    $trade_data[] = $rec;
     346                }
     347            }
     348        }
     349        // === Fallback: unknown format, keep original minimal behavior ===
     350        else {
     351            foreach ($rows as $row) {
     352                $g = $map_row($headers, $row);
     353                $instrument = $g['instrument'] ?? '';
     354                $account    = $g['account'] ?? '';
     355                $qty        = (int)($g['qty'] ?? 1);
     356                $entry_p    = (float)($g['entry price'] ?? 0);
     357                $exit_p     = (float)($g['exit price']  ?? 0);
     358                $side       = strtolower($g['market pos.'] ?? '');
     359                $entry_ts   = isset($g['entry time']) && $g['entry time'] !== '' ? strtotime($g['entry time']) : 0;
     360                [$mult, $comm] = $get_mult_comm($instrument);
     361                $pnl = 0.0;
     362                if ($entry_p && $exit_p) {
     363                    if ($side === 'long')  $pnl = ($exit_p - $entry_p) * $qty * $mult;
     364                    if ($side === 'short') $pnl = ($entry_p - $exit_p) * $qty * $mult;
     365                    $pnl -= $comm * $qty;
     366                    $pnl = round($pnl, 2);
     367                }
     368                $trade_data[] = [
     369                    'Instrument'  => $instrument,
     370                    'Account'     => $account,
     371                    'Entry Time'  => $entry_ts ? $fmt_time($entry_ts) : '',
     372                    'EntryTS'     => $entry_ts,
     373                    'Exit Time'   => '',
     374                    'ExitTS'      => 0,
     375                    'Qty'         => $qty,
     376                    'Entry Price' => (float)$entry_p,
     377                    'Exit Price'  => (float)$exit_p,
     378                    'P&L'         => $pnl,
     379                    'Side'        => $side,
     380                ];
    167381            }
    168382        }
     
    170384        // Save trade data as post meta (as an array of trades)
    171385        update_post_meta($post_id, 'trade_repeater', $trade_data);
    172 
    173         // Output saved data for debugging
    174         // echo '<h2>Saved Meta Data (Debug)</h2>';
    175         // echo '<pre>';
    176         // echo wp_json_encode($trade_data, JSON_PRETTY_PRINT);
    177         // echo '</pre>';
    178386    }
    179387}
  • tradejournal/trunk/includes/logs/plugin-log.log

    r3205179 r3346660  
    1 [2024-11-15 20:44:44] Retrieved license key: D984C8B46A5D0869
    2 [2024-11-15 20:45:04] Retrieved license key: test
    3 [2024-11-15 20:46:34] Retrieved license key: test
    4 [2024-11-15 20:46:47] Retrieved license key: D984C8B46A5D0869
    5 [2024-11-15 20:55:23] Retrieved license key: D984C8B46A5D0869
    6 [2024-11-15 20:55:27] Retrieved license key: D984C8B46A5D0869
    7 [2024-11-16 00:36:27] Retrieved license key: D984C8B46A5D0869
    8 [2024-11-16 00:36:35] Retrieved license key: test
    9 [2024-11-16 00:36:47] Retrieved license key: D984C8B46A5D0869
    10 [2024-11-16 14:33:12] Retrieved license key: D984C8B46A5D0869
    11 [2024-11-16 17:45:39] Retrieved license key: D984C8B46A5D0869
    12 [2024-11-16 23:15:33] Retrieved license key: D984C8B46A5D0869
    13 [2024-11-16 23:15:44] Retrieved license key: D984C8B46A5D0869
    14 [2024-11-16 23:28:51] Retrieved license key: D984C8B46A5D0869
    15 [2024-11-23 17:26:46] Retrieved license key: D984C8B46A5D0869
    16 [2024-11-23 17:53:02] Retrieved license key: 111AA34A9441CA37
    17 [2024-11-23 17:53:21] Retrieved license key: 111AA34A9441CA37
    18 [2024-11-23 18:02:34] Retrieved license key: 111AA34A9441CA37
    19 [2024-11-23 18:02:45] Retrieved license key: 111AA34A9441CA37
    20 [2024-11-23 18:03:14] Retrieved license key: 111AA34A9441CA37
    21 [2024-11-23 18:03:25] Retrieved license key: 111AA34A9441CA37
    22 [2024-11-23 18:03:32] Retrieved license key: 111AA34A9441CA37
    23 [2024-11-23 18:10:18] Retrieved license key: 111AA34A9441CA37
    24 [2024-11-23 18:10:39] Retrieved license key: 111AA34A9441CA37
    25 [2024-11-23 18:11:04] Retrieved license key: test
    26 [2024-11-23 18:14:05] Retrieved license key: test
    27 [2024-11-23 18:14:17] Retrieved license key: test
    28 [2024-11-23 18:15:08] Retrieved license key: test
    29 [2024-11-23 18:15:18] Retrieved license key: test
    30 [2024-11-23 18:15:38] Retrieved license key: 111AA34A9441CA37
    31 [2024-11-23 18:22:33] Retrieved license key: 111AA34A9441CA37
    32 [2024-11-23 18:22:49] Retrieved license key: test
    33 [2024-11-23 18:24:15] Retrieved license key: test
    34 [2024-11-23 18:24:17] Retrieved license key: test
    35 [2024-11-23 18:24:17] Retrieved license key: test
    36 [2024-11-23 18:25:32] Retrieved license key: 111AA34A9441CA37
    37 [2024-11-23 18:25:33] Retrieved license key: 111AA34A9441CA37
    38 [2024-11-23 18:25:34] Retrieved license key: 111AA34A9441CA37
    39 [2024-11-23 18:25:46] Retrieved license key: 111AA34A9441CA37
    40 [2024-11-23 18:29:39] Retrieved license key: 111AA34A9441CA37
    41 [2024-11-23 18:29:55] Retrieved license key: 111AA34A9441CA37
    42 [2024-11-23 18:30:12] Retrieved license key: 111AA34A9441CA37
    43 [2024-11-23 18:30:13] Retrieved license key: 111AA34A9441CA37
    44 [2024-11-23 18:30:21] Retrieved license key: 111AA34A9441CA37
    45 [2024-11-23 18:33:03] Retrieved license key: 111AA34A9441CA37
    46 [2024-11-23 18:33:05] Retrieved license key: 111AA34A9441CA37
    47 [2024-11-23 18:33:22] Retrieved license key: 111AA34A9441CA37
    48 [2024-11-23 18:35:11] Retrieved license key: 111AA34A9441CA37
    49 [2024-11-23 18:35:27] Retrieved license key: test
    50 [2024-11-23 18:35:51] Retrieved license key: 111AA34A9441CA37
    51 [2024-11-23 18:40:44] Retrieved license key: 111AA34A9441CA37
    52 [2024-11-23 18:40:58] Retrieved license key: test
    53 [2024-11-23 18:41:00] Retrieved license key: test
    54 [2024-11-23 18:41:17] Retrieved license key: 111AA34A9441CA37
    55 [2024-11-23 18:43:30] Retrieved license key: 111AA34A9441CA37
    56 [2024-11-23 18:43:44] Retrieved license key: test
    57 [2024-11-23 18:44:03] Retrieved license key: 111AA34A9441CA37
    58 [2024-11-23 18:48:13] Retrieved license key: 111AA34A9441CA37
    59 [2024-11-23 18:48:24] Retrieved license key: test
    60 [2024-11-23 18:48:53] Retrieved license key: test
    61 [2024-11-23 18:48:56] Retrieved license key: test
    62 [2024-11-23 18:49:20] Retrieved license key: 111AA34A9441CA37
    63 [2024-11-23 18:53:20] Retrieved license key: 111AA34A9441CA37
    64 [2024-11-23 19:14:59] Retrieved license key: 111AA34A9441CA37
    65 [2024-11-24 14:55:25] Retrieved license key: 111AA34A9441CA37
    66 [2024-11-24 14:55:31] Retrieved license key: 111AA34A9441CA37
    67 [2024-11-24 15:38:49] Retrieved license key: 111AA34A9441CA37
    68 [2024-11-24 15:39:02] Retrieved license key: 111AA34A9441CA37
    69 [2024-11-24 18:35:04] Retrieved license key: 111AA34A9441CA37
    70 [2024-11-24 18:49:25] Retrieved license key: 111AA34A9441CA37
    71 [2024-11-24 18:49:28] Retrieved license key: 111AA34A9441CA37
    72 [2024-11-24 18:49:58] Retrieved license key: 111AA34A9441CA37
    73 [2024-11-29 16:14:07] Retrieved license key: 111AA34A9441CA37
    74 [2024-11-29 16:14:39] Retrieved license key: 111AA34A9441CA37
    75 [2024-11-29 16:42:17] Retrieved license key: 111AA34A9441CA37
    76 [2024-11-29 16:42:43] Retrieved license key: 111AA34A9441CA37
    77 [2024-11-29 17:16:53] Retrieved license key: 111AA34A9441CA37
    78 [2024-11-29 17:17:14] Retrieved license key: 111AA34A9441CA37
    79 [2024-11-29 17:18:50] Retrieved license key: 111AA34A9441CA37
    80 [2024-11-29 17:19:13] Retrieved license key: 111AA34A9441CA37
    81 [2024-11-29 17:20:05] Retrieved license key: 111AA34A9441CA37
    82 [2024-11-29 17:20:23] Retrieved license key: 111AA34A9441CA37
    83 [2024-11-29 17:20:51] Retrieved license key: 111AA34A9441CA37
    84 [2024-11-29 17:21:06] Retrieved license key: 111AA34A9441CA37
    85 [2024-11-29 22:15:36] Retrieved license key: 111AA34A9441CA37
    86 [2024-11-29 22:15:49] Retrieved license key: 111AA34A9441CA37
    87 [2024-11-29 22:21:00] Retrieved license key: 111AA34A9441CA37
    88 [2024-11-29 22:21:21] Retrieved license key: 111AA34A9441CA37
    89 [2024-11-29 22:21:33] Retrieved license key: 111AA34A9441CA37
    90 [2024-11-29 22:24:41] Retrieved license key: 111AA34A9441CA37
    91 [2024-11-29 22:24:54] Retrieved license key: 111AA34A9441CA37
    92 [2024-11-29 22:25:55] Retrieved license key: 111AA34A9441CA37
    93 [2024-11-29 22:26:11] Retrieved license key: 111AA34A9441CA37
    94 [2024-11-29 22:35:47] Retrieved license key: 111AA34A9441CA37
    95 [2024-11-29 22:36:05] Retrieved license key: 111AA34A9441CA37
    96 [2024-11-29 22:38:46] Retrieved license key: 111AA34A9441CA37
    97 [2024-11-29 22:39:06] Retrieved license key: 111AA34A9441CA37
    98 [2024-11-29 22:53:56] Retrieved license key: 111AA34A9441CA37
    99 [2024-11-29 22:54:22] Retrieved license key: 111AA34A9441CA37
    100 [2024-11-29 23:09:09] Retrieved license key: 111AA34A9441CA37
    101 [2024-11-29 23:20:31] Retrieved license key: 111AA34A9441CA37
    102 [2024-11-29 23:21:14] Retrieved license key: 111AA34A9441CA37
    103 [2024-11-29 23:21:26] Retrieved license key: 111AA34A9441CA37
    104 [2024-11-29 23:26:17] Retrieved license key: 111AA34A9441CA37
    105 [2024-11-29 23:26:29] Retrieved license key: 111AA34A9441CA37
    106 [2024-11-29 23:27:33] Retrieved license key: 111AA34A9441CA37
    107 [2024-11-30 00:19:55] Retrieved license key: 111AA34A9441CA37
    108 [2024-11-30 00:20:04] Retrieved license key: 111AA34A9441CA37
    109 [2024-11-30 00:40:11] Retrieved license key: 111AA34A9441CA37
    110 [2024-11-30 00:40:33] Retrieved license key: 111AA34A9441CA37
    111 [2024-11-30 00:41:22] Retrieved license key: 111AA34A9441CA37
    112 [2024-11-30 00:41:32] Retrieved license key: 111AA34A9441CA37
    113 [2024-11-30 00:42:13] Retrieved license key: 111AA34A9441CA37
    114 [2024-11-30 00:44:17] Retrieved license key: 111AA34A9441CA37
    115 [2024-11-30 00:44:27] Retrieved license key: 111AA34A9441CA37
    116 [2024-11-30 00:47:04] Retrieved license key: 111AA34A9441CA37
    117 [2024-11-30 02:34:35] Retrieved license key: 111AA34A9441CA37
    118 [2024-11-30 02:34:44] Retrieved license key: 111AA34A9441CA37
    119 [2024-11-30 02:35:00] Retrieved license key: 111AA34A9441CA37
    120 [2024-11-30 02:37:38] Retrieved license key: 111AA34A9441CA37
    121 [2024-11-30 15:04:20] Retrieved license key: 111AA34A9441CA37
    122 [2024-11-30 15:04:37] Retrieved license key: 111AA34A9441CA37
    123 [2024-11-30 15:06:54] Retrieved license key: 111AA34A9441CA37
    124 [2024-11-30 15:07:24] Retrieved license key: 111AA34A9441CA37
    125 [2024-11-30 15:58:34] Retrieved license key: 111AA34A9441CA37
    126 [2024-11-30 15:58:45] Retrieved license key: 111AA34A9441CA37
    127 [2024-11-30 16:00:08] Retrieved license key: 111AA34A9441CA37
    128 [2024-11-30 16:00:11] Retrieved license key: 111AA34A9441CA37
    129 [2024-11-30 16:00:14] Retrieved license key: 111AA34A9441CA37
    130 [2024-11-30 16:05:45] Retrieved license key: 111AA34A9441CA37
    131 [2024-11-30 16:05:48] Retrieved license key: 111AA34A9441CA37
    132 [2024-11-30 16:17:01] License key is empty or not set.
    133 [2024-11-30 16:17:05] License key is empty or not set.
    134 [2024-11-30 16:17:57] License key is empty or not set.
    135 [2024-11-30 16:21:58] License key is empty or not set.
    136 [2024-11-30 16:22:00] License key is empty or not set.
    137 [2024-11-30 16:22:07] License key is empty or not set.
    138 [2024-11-30 16:22:22] License key is empty or not set.
    139 [2024-11-30 16:22:41] License key is empty or not set.
    140 [2024-11-30 16:23:27] License key is empty or not set.
    141 [2024-11-30 17:39:15] Retrieved license key: 111AA34A9441CA37
    142 [2024-11-30 17:49:07] Retrieved license key: 111AA34A9441CA37
    143 [2024-11-30 17:49:21] Retrieved license key: 111AA34A9441CA37
    144 [2024-11-30 21:33:03] Retrieved license key: 111AA34A9441CA37
    145 [2024-11-30 21:34:58] Retrieved license key: 111AA34A9441CA37
    146 [2024-11-30 21:35:14] Retrieved license key: 111AA34A9441CA37
    147 [2024-11-30 21:35:18] Retrieved license key: 111AA34A9441CA37
    148 [2024-11-30 21:38:41] Retrieved license key: 111AA34A9441CA37
    149 [2024-11-30 21:41:25] Retrieved license key: 111AA34A9441CA37
    150 [2024-11-30 21:41:39] Retrieved license key: 111AA34A9441CA37
    151 [2024-11-30 21:44:52] Retrieved license key: 111AA34A9441CA37
    152 [2024-11-30 21:46:20] Retrieved license key: 111AA34A9441CA37
    153 [2024-11-30 21:46:31] Retrieved license key: 111AA34A9441CA37
    154 [2024-11-30 22:02:17] Retrieved license key: 111AA34A9441CA37
    155 [2024-11-30 22:06:54] Retrieved license key: 111AA34A9441CA37
    156 [2024-11-30 22:07:02] Retrieved license key: 111AA34A9441CA37
    157 [2024-11-30 22:14:38] Retrieved license key: 111AA34A9441CA37
    158 [2024-11-30 22:14:42] Retrieved license key: 111AA34A9441CA37
    159 [2024-11-30 22:15:10] Retrieved license key: 111AA34A9441CA37
    160 [2024-11-30 22:19:01] Retrieved license key: test
    161 [2024-11-30 22:22:59] Retrieved license key: 111AA34A9441CA37
    162 [2024-11-30 22:23:37] Retrieved license key: 111AA34A9441CA37
    163 [2024-11-30 22:23:49] Retrieved license key: 111AA34A9441CA37
    164 [2024-11-30 22:25:52] Retrieved license key: 111AA34A9441CA37
    165 [2024-11-30 22:29:07] Retrieved license key: test
    166 [2024-11-30 22:29:38] Retrieved license key: 111AA34A9441CA37
    167 [2024-11-30 22:31:16] Retrieved license key: 111AA34A9441CA37
    168 [2024-11-30 22:34:10] Retrieved license key: 111AA34A9441CA37
    169 [2024-11-30 22:34:27] Retrieved license key: test
    170 [2024-11-30 22:38:21] Retrieved license key: 111AA34A9441CA37
    171 [2024-11-30 22:40:28] Retrieved license key: 111AA34A9441CA37
    172 [2024-11-30 22:40:42] Retrieved license key: 111AA34A9441CA37
    173 [2024-11-30 22:42:50] Retrieved license key: 111AA34A9441CA37
    174 [2024-11-30 22:43:04] Retrieved license key: 111AA34A9441CA37
    175 [2024-11-30 22:46:21] Retrieved license key: 111AA34A9441CA37
    176 [2024-11-30 22:46:37] Retrieved license key: 111AA34A9441CA37
    177 [2024-11-30 22:47:24] Retrieved license key: 111AA34A9441CA37
    178 [2024-11-30 22:47:37] Retrieved license key: 111AA34A9441CA37
    179 [2024-11-30 22:48:14] Retrieved license key: 111AA34A9441CA37
    180 [2024-11-30 22:48:20] Retrieved license key: 111AA34A9441CA37
    181 [2024-11-30 22:54:16] Retrieved license key: 111AA34A9441CA37
    182 [2024-11-30 22:54:25] Retrieved license key: 111AA34A9441CA37
    183 [2024-11-30 22:54:34] Retrieved license key: 111AA34A9441CA37
    184 [2024-11-30 23:02:22] Retrieved license key: 111AA34A9441CA37
    185 [2024-11-30 23:02:31] Retrieved license key: 111AA34A9441CA37
    186 [2024-11-30 23:05:46] Retrieved license key: 111AA34A9441CA37
    187 [2024-11-30 23:05:51] Retrieved license key: 111AA34A9441CA37
    188 [2024-11-30 23:05:58] Retrieved license key: 111AA34A9441CA37
    189 [2024-11-30 23:09:33] Retrieved license key: 111AA34A9441CA37
    190 [2024-11-30 23:09:47] Retrieved license key: 111AA34A9441CA37
    191 [2024-11-30 23:12:29] Retrieved license key: 111AA34A9441CA37
    192 [2024-11-30 23:12:36] Retrieved license key: 111AA34A9441CA37
    193 [2024-11-30 23:18:40] Retrieved license key: 111AA34A9441CA37
    194 [2024-11-30 23:18:50] Retrieved license key: 111AA34A9441CA37
    195 [2024-11-30 23:24:07] Retrieved license key: 111AA34A9441CA37
    196 [2024-11-30 23:24:15] Retrieved license key: 111AA34A9441CA37
    197 [2024-11-30 23:24:22] Retrieved license key: 111AA34A9441CA37
    198 [2024-11-30 23:27:40] Retrieved license key: 111AA34A9441CA37
    199 [2024-11-30 23:27:42] Retrieved license key: 111AA34A9441CA37
    200 [2024-11-30 23:27:49] Retrieved license key: 111AA34A9441CA37
    201 [2024-11-30 23:27:54] Retrieved license key: 111AA34A9441CA37
    202 [2024-11-30 23:34:13] Retrieved license key: D984C8B46A5D0869
    203 [2024-11-30 23:34:13] Retrieved license key: D984C8B46A5D0869
    204 [2024-11-30 23:34:34] Retrieved license key: test
    205 [2024-11-30 23:34:44] Retrieved license key: test
    206 [2024-11-30 23:35:35] Retrieved license key: 111AA34A9441CA37
    207 [2024-11-30 23:57:30] Retrieved license key: 111AA34A9441CA37
    208 [2024-12-01 00:04:55] Retrieved license key: 111AA34A9441CA37
    209 [2024-12-01 00:06:03] Retrieved license key: 111AA34A9441CA37
    210 [2024-12-01 00:06:09] Retrieved license key: 111AA34A9441CA37
    211 [2024-12-01 00:09:06] Retrieved license key: 111AA34A9441CA37
    212 [2024-12-01 00:23:42] Retrieved license key: 111AA34A9441CA37
    213 [2024-12-01 00:26:54] Retrieved license key: test
    214 [2024-12-01 00:31:18] Retrieved license key: test
    215 [2024-12-01 00:31:54] Retrieved license key: test
    216 [2024-12-01 00:32:07] Retrieved license key: 111AA34A9441CA37
     1[2025-01-21 22:58:44] Retrieved license key: 111AA34A9441CA37
     2[2025-01-21 22:59:16] Retrieved license key: 111AA34A9441CA37
     3[2025-01-22 23:10:35] Retrieved license key: 111AA34A9441CA37
     4[2025-01-22 23:11:05] Retrieved license key: 111AA34A9441CA37
     5[2025-01-22 23:14:10] Retrieved license key: 111AA34A9441CA37
     6[2025-01-22 23:14:20] Retrieved license key: 111AA34A9441CA37
     7[2025-08-05 22:10:38] Retrieved license key: 111AA34A9441CA37
     8[2025-08-05 22:11:05] Retrieved license key: 111AA34A9441CA37
     9[2025-08-05 22:19:35] Retrieved license key: 111AA34A9441CA37
     10[2025-08-05 22:19:52] Retrieved license key: 111AA34A9441CA37
     11[2025-08-05 22:21:11] Retrieved license key: 111AA34A9441CA37
     12[2025-08-05 22:21:25] Retrieved license key: 111AA34A9441CA37
     13[2025-08-05 22:21:40] Retrieved license key: 111AA34A9441CA37
     14[2025-08-05 22:21:56] Retrieved license key: 111AA34A9441CA37
     15[2025-08-05 22:28:44] Retrieved license key: 111AA34A9441CA37
     16[2025-08-05 22:28:53] Retrieved license key: 111AA34A9441CA37
     17[2025-08-05 22:40:51] Retrieved license key: 111AA34A9441CA37
     18[2025-08-05 22:41:06] Retrieved license key: 111AA34A9441CA37
     19[2025-08-05 22:44:01] Retrieved license key: 111AA34A9441CA37
     20[2025-08-05 22:44:13] Retrieved license key: 111AA34A9441CA37
     21[2025-08-05 23:43:42] Retrieved license key: 111AA34A9441CA37
     22[2025-08-05 23:43:53] Retrieved license key: 111AA34A9441CA37
     23[2025-08-06 18:50:46] Retrieved license key: 111AA34A9441CA37
     24[2025-08-06 18:51:00] Retrieved license key: 111AA34A9441CA37
     25[2025-08-06 20:36:23] Retrieved license key: 111AA34A9441CA37
     26[2025-08-06 20:36:34] Retrieved license key: 111AA34A9441CA37
     27[2025-08-06 20:38:03] Retrieved license key: 111AA34A9441CA37
     28[2025-08-06 20:38:17] Retrieved license key: 111AA34A9441CA37
     29[2025-08-18 20:37:50] Retrieved license key: 111AA34A9441CA37
     30[2025-08-18 20:37:58] Retrieved license key: 111AA34A9441CA37
     31[2025-08-18 20:38:27] Retrieved license key: 111AA34A9441CA37
     32[2025-08-18 20:38:50] Retrieved license key: 111AA34A9441CA37
     33[2025-08-18 20:39:08] Retrieved license key: 111AA34A9441CA37
     34[2025-08-18 20:39:23] Retrieved license key: 111AA34A9441CA37
     35[2025-08-18 20:39:39] Retrieved license key: 111AA34A9441CA37
     36[2025-08-18 20:39:54] Retrieved license key: 111AA34A9441CA37
     37[2025-08-18 20:49:41] Retrieved license key: 111AA34A9441CA37
     38[2025-08-18 20:50:06] Retrieved license key: 111AA34A9441CA37
     39[2025-08-18 20:54:40] Retrieved license key: 111AA34A9441CA37
     40[2025-08-18 20:54:50] Retrieved license key: 111AA34A9441CA37
     41[2025-08-18 20:57:59] Retrieved license key: 111AA34A9441CA37
     42[2025-08-18 20:58:10] Retrieved license key: 111AA34A9441CA37
     43[2025-08-18 20:58:49] Retrieved license key: 111AA34A9441CA37
     44[2025-08-18 20:58:58] Retrieved license key: 111AA34A9441CA37
     45[2025-08-18 21:00:13] Retrieved license key: 111AA34A9441CA37
     46[2025-08-18 21:00:21] Retrieved license key: 111AA34A9441CA37
     47[2025-08-18 21:01:03] Retrieved license key: 111AA34A9441CA37
     48[2025-08-18 21:01:44] Retrieved license key: 111AA34A9441CA37
     49[2025-08-18 21:01:56] Retrieved license key: 111AA34A9441CA37
     50[2025-08-18 21:06:44] Retrieved license key: 111AA34A9441CA37
     51[2025-08-18 21:06:54] Retrieved license key: 111AA34A9441CA37
  • tradejournal/trunk/readme.txt

    r3269231 r3346660  
    33Tags: trade journal, trading, NinjaTrader, csv import, trading platform
    44Requires at least: 5.0
    5 Tested up to: 6.8
    6 Stable tag: 1.2
     5Tested up to: 6.8.2
     6Stable tag: 1.2.0
    77Requires PHP: 7.0
    88License: GPLv2 or later
     
    8686
    8787== Changelog ==
     88
     89= 1.2.0 =
     90* Added NT8.1+ CSV format support
    8891
    8992= 1.1.1 =
     
    155158== Upgrade Notice ==
    156159
     160= 1.2.0 =
     161* Added NT8.1+ CSV format support
     162
    157163= 1.1.1 =
    158164* Fixed: Screenshot removal button not working as expected.
  • tradejournal/trunk/tradejournal.php

    r3276894 r3346660  
    33Plugin Name: TradeJournal WP
    44Description: TradeJournal WP imports trades from NinjaTrader CSV files, creating detailed journal entries for each trading day. Includes trade management, P&L calculation, responsive tables, lightbox for screenshots, and compatibility with custom post types and block-based themes. Track performance, analyze setups, and organize screenshots easily within WordPress.
    5 Version: 1.1.1
     5Version: 1.2.0
    66Author: Laith Sinawi
    77Author URI: https://sinawiwebdesign.com
    88License: GPL2
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    10 Tested up to: 6.8
     10Tested up to: 6.8.2
    1111*/
    1212
Note: See TracChangeset for help on using the changeset viewer.